Команда sed не работает в сценарии оболочки - PullRequest
1 голос
/ 19 июля 2011

У меня есть сценарий оболочки, который выглядит следующим образом:

#!/bin/bash
for file in $1/*.html; do
   echo "Working on $file ..."

   # delete headers in html files.
   sed -n '1,9d' $file

   # delete the last 4 lines of the file.
   sed -n -e :a -e '1,4!{P;N;D;};N;ba'

   # ant runs regex task on all apt files
   ant -Dtarget.file=$file

   # all .html are changed to .md
   mv $file `echo $file | sed 's/\(.*\.\)html/\1md/'` ;

done

, но сценарий зависает при выполнении первой команды sed, и мне нужно принудительно завершить работу.Мне интересно, есть ли что-то не так в том, как я это настроил?

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

Ответы [ 3 ]

4 голосов
/ 19 июля 2011

Я думаю, вы обнаружите, что он висит на секунде sed, где вы не указали имя файла для работы.Другими словами, он будет принимать стандартный ввод с терминала.

Вы не получите вывод с первого sed, поскольку -n предотвращает печать по умолчанию пространства шаблона.Если вы пытаетесь изменить фактический файл , а не выводить изменения в стандартный вывод, вам необходим редактор мест нахождения -i.

Если вы не можете использовать опцию на месте,вам нужно будет сделать что-то вроде:

sed -n '1,9d' ${file} >${file}.tmp0
sed -n -e :a -e '1,4!{P;N;D;};N;ba' ${file}.tmp0 >${file}
rm -f ${file}.tmp0

При этом для внесения изменений используется временный файл, кроме последнего, который перезаписывает исходный файл.Имейте в виду, что это меняет оригинал - если это не то, что вы хотите, вы можете изменить второй sed для вывода на ${file}.tmp2, но вам придется настроить последующие команды, чтобы принять это вaccount.

Если вы действительно хотите удалить первые девять и последние четыре строки файла, вы также можете использовать что-то вроде:

head --lines=-4 oldfile.txt | tail --lines=+10 >newfile.txt

, если у вас есть реализация [rd]ecenthead/tail.head печатает все, кроме последних четырех строк, а tail начинает печатать с десятой строки.

0 голосов
/ 19 июля 2011

Изменить первую строку на:

#!/bin/bash -x

Это покажет вам каждую команду, которую выполняет bash, после всех расширений.

Я предполагаю, что $1/*.html не соответствует ни одному файлу; следовательно, строка sed оценивается как sed -n '1,9d', и поэтому sed пытается читать из stdin

0 голосов
/ 19 июля 2011

Какую команду вы выполняете?Если ничто не соответствует глобусу файла, то он физически вставит туда нерасширенную строку.

Например, попробуйте это:

$ for i in foo/*.bar; do echo $i; done
foo/*.bar

Итак, ваш скрипт sed выполняет бомбардировку, потому что имя файла этополучение не существует, что означает, что он будет действовать так, как если бы не был указан аргумент файла (т. е. стандартный ввод).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...