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

Jer*_* M. 2 bash sed centos7

在我当前的目录(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' {} \;
Run Code Online (Sandbox Code Playgroud)

基本上,我需要切换:

./makeprog $MAKE_FLAGS CFLAGS="-I/usr/local/include/libtool" OFLAGS="-L/usr/local/lib
Run Code Online (Sandbox Code Playgroud)

./makeprog
Run Code Online (Sandbox Code Playgroud)

有人能帮忙吗?我得到的错误是:

sed: -e expression #1, char 43: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

我已经看过了:

我相信我的错误是由./command引起的.我已经按照切换all/to +的建议,但是仍然没有用,因为我收到以下错误:

sed: -e expression #1, char 110: unterminated `s' command
Run Code Online (Sandbox Code Playgroud)

谢谢.

gle*_*man 6

您的问题是您使用斜杠作为s///命令的分隔符,但是您在模式中添加了斜杠.您可以选择不出现在模式中的其他分隔符.

假设您当前的目录是projDir,并且只有一个makeprog调用:

sed -i -E 's#(./makeprog) .*#\1#' */README.md
Run Code Online (Sandbox Code Playgroud)

要么

perl -i -e 's{./makeprog\K.*}{}' */README.md
Run Code Online (Sandbox Code Playgroud)

如果您想专门匹配该确切的行,那么:

# 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
Run Code Online (Sandbox Code Playgroud)