使用 sed 替换多个文件中的相同文本行
Using sed to replace the same text line in multiple files
在我的当前目录(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'
我已经看过了:
- How to replace a path with another path in sed?
- 其他一些在线资源
我认为我的错误是由 ./ 命令引起的。我遵循了将所有 / 切换为 + 的建议,但仍然没有用,因为我收到以下错误:
sed: -e expression #1, char 110: unterminated `s' command
谢谢。
您的问题是您使用斜杠作为 s///
命令的定界符,但您将斜杠放入模式中。您可以选择模式中未出现的其他分隔符。
假设您当前的目录是projDir,并且只有一次调用makeprog:
sed -i -E 's#(./makeprog) .*##' */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
在我的当前目录(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'
我已经看过了:
- How to replace a path with another path in sed?
- 其他一些在线资源
我认为我的错误是由 ./ 命令引起的。我遵循了将所有 / 切换为 + 的建议,但仍然没有用,因为我收到以下错误:
sed: -e expression #1, char 110: unterminated `s' command
谢谢。
您的问题是您使用斜杠作为 s///
命令的定界符,但您将斜杠放入模式中。您可以选择模式中未出现的其他分隔符。
假设您当前的目录是projDir,并且只有一次调用makeprog:
sed -i -E 's#(./makeprog) .*##' */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