【发布时间】:2016-03-09 19:37:22
【问题描述】:
我有一个文件 pattern.txt,它由一行很长的复杂代码(~8200 个字符)组成。
此代码可以在多个目录中的多个文件中找到。
我可以使用
轻松识别这些文件的列表grep -rli 'uniquepartofthecode' *
我关心的是如何用文件中的确切文本替换它?
我尝试过:
var=$(cat pattern.txt)
sed -i "s/$var//g" targetfile.txt
但我收到以下错误:
sed: -e expression #1, char 96: `s' 的未知选项
sed 将我的 $var 内容解释为正则表达式,我希望它只匹配确切的文本。
pattern.txt 内容可能或多或少是任意字符组合,所以恐怕我无法有效地转义每个字符。
有没有使用 sed 的解决方案?或者我应该使用其他工具吗?
编辑:
我尝试使用此解决方案从我的文本文件中创建正确的正则表达式模式。 Is it possible to escape regex metacharacters reliably with sed
整体流程是:
var=$(cat pattern.txt)
searchEscaped=$(sed 's/[^^]/[&]/g; s/\^/\\^/g' <<<"$var")
sed -n "s/$searchEscaped/foo/p" <<<"$var" # if ok, echoes 'foo'
最后一个命令显示“foo”。 $searchEscaped 似乎已正确转义。 虽然,这并没有返回任何东西(它应该显示 foo + 没有匹配部分的文件的其余部分):
sed -n "s/$searchEscaped/foo/p" targetfile.txt
【问题讨论】:
-
在
sed -n "s/$searchEscaped/foo/p" <<<"$search" # if ok, echoes 'foo'之前效果很好,然后我尝试sed -i "s/$searchEscaped//g" targetfile.txt但没有成功 -
您正在使用
-n这会抑制 sed 的输出。你能显示你的输入文件吗?