Использование sed для нескольких файлов в скрипте - PullRequest
2 голосов
/ 01 апреля 2012

У меня есть скрипт sed для вставки строки перед тем, как в файле найдено ключевое слово «MYWORD». Мой скрипт выглядит следующим образом:

sed -e '/MYWORD/ i\MY NEW LINE TO BE INSERTED' <inputFilename >outputFilename

Поскольку это будет происходить только с одним файлом, как я могу изменить свой сценарий, чтобы эта вставка выполнялась для каждого файла в каталоге?

1 Ответ

1 голос
/ 01 апреля 2012

Как сказал nosid, вы можете использовать опцию -i для редактирования файла на месте.Прочтите справочную страницу в ВАШЕЙ операционной системе, чтобы точно определить, как использовать -i.Затем вы можете обернуть sed в небольшой сценарий оболочки, чтобы идентифицировать файл и действовать на него:

for this in foo*.txt; do
  sed -i'' -e 'your-sed-script' "$this"
done

Тем не менее, я не уверен, что ваш метод вставки будет работать или, по крайней мере, работать надежно.Я тестировал во FreeBSD и OS X, и это не сработало вообще.Моя обычная стратегия для вставки строк - использовать awk.Таким образом (например):

for this in foo*.txt; do
  awk '/MYWORD/{print "Extra line of text goes here."} 1' "$this" > "$this.$$"
  mv "$this.$$" "$this"
done

Здесь строка awk ищет / MYWORD / (расширенное регулярное выражение, тогда как sed по умолчанию - базовые регулярные выражения).Если он его находит, сначала печатается текст «Extra».Затем «1» оценивается как «истина», которая также будет печатать текущую строку.В результате текст «Extra» вставляется в строку перед MYWORD.

Обратите внимание, что это не хороший скрипт.Это расточительно, обвязка и переименование файлов, которые не были изменены.Вы можете улучшить его, выбрав «mv» временный файл в зависимости от значения выхода из awk, или вы можете использовать cmp, чтобы определить, изменился ли файл, затем очистить оставшиеся временные файлы и т. Д. Но он получаетуказать поперек.

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