Поместите все команды sed в один файл сценария оболочки

По существу мне дают текстовый файл и, как предполагается, завинчиваю с ним через команды sed. Я имею приблизительно 7 общих количеств команд sed и должен поместить их всех в один сценарий оболочки для создания вывода ТОГО, когда этот скрипт запущен.

Текстовый файл, который будет завинчен с: students.txt

Students.txt:

DogG DOGGGGGGGG
dog dog dog Jamesb
JamesBrady
derghnregnrig
JamesBeody

Таким образом, первый sed избавляется от первой и последней строки. второй sed заменяет собаку третью DOGGGG sed, находит и печатает все строки w/JamesBrady, четвертый sed находит и печатает все строки с derghnregnrig

Команды Sed (примеры БАКАЛАВРА НАУК):

sed -e '1d' -e '$d' -e '/^$/d' students.txt
sed -n s/dog/DOGGGG/g students.txt
sed -n /JamesBrady/p students.txt
sed -n /derghnregnrig/p students.txt

Вышеупомянутое sed команды является всеми для входа в один файл сценария оболочки, и когда выполненный, как предполагается, производят (кумулятивный?) эффекты на один текстовый файл (students.txt)

До сих пор я попытался искать корректную процедуру того, чтобы сделать это и встретил только беспорядок. Кто-то может объяснить в ясности и с терпением новичка, как несколько sed управляют, и какие-либо команды (awk, grep, и т.д.) в этом отношении, как предполагается, соответствуют в единственном файле сценария оболочки?

Использование Ubuntu 16.04, Vim. Оболочка Bash

3
задан 11 October 2016 в 15:28

3 ответа

Я предполагаю, что Вы на самом деле хотите видеть строку с DOGGGG, так как Вы редактируете его (иначе, почему беспокойство?)

Использование {} группе управляет в блоке...

sed -n '{
       1d
       $d
       /^$/d
       s/dog/DOGGGG/g
       /DOGGGG/p
       /JamesBrady/p
       /derghnregnrig/p
}' students.txt

результат:

  DOGGGG DOGGGG DOGGGG Jamesb
  JamesBrady
  derghnregnrig

Вам не нужно все это для Вашего примера...

sed -n '{
       1d
       $d
       s/dog/DOGGGG/g;p
}' students.txt

, но я предполагаю, что Ваш реальный файл действительно имеет пустые строки и материал в середине, которую Вы не хотите печатать.

7
ответ дан 1 December 2019 в 13:08

Опция 1: поместите каждый sed команда в Вашем сценарии оболочки на отдельной строке и сделайте, чтобы они управляли на месте использованием переключатель-i.

Опция 2: используйте сингл sed командная строка в Вашем сценарии оболочки, но передайте каждое выражение с помощью отдельного переключатель-e.

Опция 2 предпочтена, если Ваши выражения ортогональные (то есть, они не воздействуют на те же соответствия).

0
ответ дан 1 December 2019 в 13:08

В первую очередь, проверьте те команды sed, они не могут делать то, что Вы хотите. Например, второй, вместо

sed -n s/dog/DOGGGG/g students.txt

Я думаю, что это должно быть

sed -i 's/dog/DOGGGG/g' students.txt

Читать man sed и удостоверьтесь, что они индивидуально работают перед созданием сценария.

Сделайте новый файл (т.е. нано yourscript.sh) и запись #!/bin/bash сопровождаемый Вашими командами sed, заменяя students.txt с $1. Это $1 представляет первый аргумент, когда Вы называете сценарий:

#!/bin/bash
sed -e '1d' -e '$d' -e '/^$/d' $1
sed -n s/dog/DOGGGG/g $1
sed -n /JamesBrady/p $1
sed -n /derghnregnrig/p $1

С корректными командами sed. Теперь дайте полномочия выполнения сценария:

sudo chmod 755 yourscript.sh

И выполните его с именем файла как первый аргумент:

sudo ./yourscript.sh students.txt

Вам только нужен sudo в этой последней команде, если у Вашего пользователя нет разрешения изменить students.txt.

3
ответ дан 1 December 2019 в 13:08

Другие вопросы по тегам:

Похожие вопросы: