bash - 管道问题在 sed 中查找(查找并替换)

标签 bash sed

这是我当前的代码,我的目标是(递归地)查找给定目录中的每个文件并将“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/

相关文章:

linux - bash 脚本中 Grep 命令的问题

linux - 在 Dockerfile 中使用来自 docker-compose build --build-arg 的参数

shell - 仅当该行与给定模式匹配时,如何删除该行的第一个字符

unix - 使用 sed 从文本文件中提取摩尔斯电码

linux - 使用不同文件夹中的文件将某些文件信息输出到文本文件

linux - 使用 sed 将附加字符添加到文件中的字符串

bash - 循环分钟并用 bash 回显

bash - 管道的左侧是子壳?

python - 递归遍历目录并替换函数调用

c - 如何在system()中使用C代码变量