Использование sed для замены одной и той же текстовой строки в нескольких файлах - PullRequest
0 голосов
/ 17 октября 2018

В моем текущем каталоге (projDir) у меня примерно 41 папка:

  • ProgOneDir
  • ProgTwoDir
  • ProgThreeDir
  • ...
  • ProgFortyOneDir

... и т. Д. (Я не придумал схему именования, я не системный администратор, поэтому, пожалуйста, не кричите на меня).

Внутри каждой из подпапок есть файлы README.md, которые мне нужно отредактировать.Вместо того, чтобы заходить в каждую подпапку и редактировать там файлы, я хотел бы использовать для этого команду sed.Файлы последовательно называются README.md

Я использую CentOS7

Моя текущая команда:

find . -name 'README.md' -exec sed -i -e 's/./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib"/./makeprog/g' {} \;

По сути, мне нужно переключиться:

./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib

до

./makeprog

Кто-нибудь сможет помочь?Я получаю ошибку:

sed: -e expression #1, char 43: unknown option to `s'

Я уже посмотрел:

Я считаю, что моя ошибка возникает с ./command.Я последовал совету переключения всех / на +, но это все равно не сработало, так как я получил следующую ошибку:

sed: -e expression #1, char 110: unterminated `s' command

Спасибо.

1 Ответ

0 голосов
/ 17 октября 2018

Ваша проблема в том, что вы используете косую черту в качестве разделителя для команды s///, но вы добавляете косые черты в шаблон.Вы можете выбрать другой разделитель, который не отображается в шаблоне.

Предполагается, что текущим каталогом является projDir, и для makeprog существует только один вызов:

sed -i -E 's#(./makeprog) .*#\1#' */README.md

или

perl -i -e 's{./makeprog\K.*}{}' */README.md

Если вы хотите точно сопоставить эту точную строку, то:

# are you missing a trailing double quote?
line='./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib'
sed -i -E "s#$line#./makeprog#" */README.md
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...