Добавить новую строку после совпадения в нескольких файлах с помощью sed - PullRequest
0 голосов
/ 17 июня 2020

Я пишу сценарий

Одна из целей сценария - добавить новую кодовую строку после совпадения с foo, в нескольких файлах .yml рекурсивно.

# Append new line after match in multiple files with sed
## sed -i -se "s/\foo/bar/g" *.yml
grep -rl foo * .| xargs sed -i -e "s/\foo/a bar/g" *.yml

I ожидалось после каждого совпадения с foo из-за /a, bar будет добавлен в новую строку во всех .yml файлах.

Я получаю неожиданно Вывод Sed: sed: can't read *.yml: No such file or directory

Подробности:

  1. ОС: Debian GNU / Linux 10
  2. sed --version: sed (GNU sed) 4.7

1 Ответ

2 голосов
/ 17 июня 2020

Вы предоставляете аргументы имени файла с помощью xargs. Вы также не должны использовать *.yml в качестве аргумента. Оболочка расширит это до файлов .yml в текущем каталоге, и вы получите сообщение об ошибке, если их нет.

Если вы хотите, чтобы grep -r проверял только .yml файлы, используйте параметр --include.

grep -rl --include='*.yml' foo . | xargs sed -i -e "s/foo/a bar/g"

Обратите внимание, что команда s не используется для добавления новой строки после строки. Используется для замены в той же строке. s/foo/ a bar/g заменяет все foo в строке на a bar. Если вы хотите добавить, избавьтесь от команды s. Кроме того, вы не ставите /g в конце команды a.

grep -rl --include='*.yml' foo . | xargs sed -i -e "/foo/a bar"

См. Как вставить текст после определенной строки в файле?

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