这是我当前的代码,我的目标是(递归地)查找给定目录中的每个文件并将“FIND”替换为“REPLACEWITH”并覆盖文件。
FIND='ALEX'
REPLACEWITH='<strong>ALEX</strong>'
DIRECTORY='/some/directory/'
find $DIRECTORY -type f -name "*.html" -print0 |
LANG=C xargs -0 sed -i "s|$FIND|$REPLACEWITH|g"
我得到的错误是:
sed: 1: "/some/directory ...": command a expects \ followed by text
最佳答案
在 BashFAQ #21 中给出,您可以使用 perl
执行搜索和替换操作,而不会将数据视为代码:
in="$FIND" out="$REPLACEWITH" find "$DIRECTORY" -type f -name '*.html' \
-exec perl -pi -e 's/\Q$ENV{"in"}/$ENV{"out"}/g' '{}' +
如果你只想包含匹配 FIND 字符串的文件,可以告诉 find
只将 grep
标记的文件传递给 perl
:
in="$FIND" out="$REPLACEWITH" find "$DIRECTORY" -type f -name '*.html' \
-exec grep -F -q -e "$FIND" '{}' ';' \
-exec perl -pi -e 's/\Q$ENV{"in"}/$ENV{"out"}/g' '{}' +
因为 grep
用于评估单个文件,所以有必要对每个文件使用一个 grep
调用,以便可以在每个文件的基础上评估其退出状态;因此,使用效率较低的 -exec ... {} ';'
操作。对于 perl
,可以用一个命令处理多个文件,因此使用 -exec ... {} +
。
请注意,fgrep
是面向行的;如果您的 FIND
字符串包含多行,那么包含其中任何一行的文件将被传递给 perl
以进行替换。
关于bash - 管道问题在 sed 中查找(查找并替换),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923469/