使用sed替换多个文件中的同一文本行

时间:2018-10-17 13:07:33

标签: bash sed centos7

在当前目录(projDir)中,大约有41个文件夹,如下所示:

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

... etc(我没有提出命名方案,而且我不是系统管理员,所以请不要对他们大喊大叫)。

在每个子文件夹中,都有我需要编辑的README.md文件。我不想使用每个sed文件夹并在那里编辑文件,而是想使用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 :(得分:6)

您的问题是您使用斜杠作为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