Bash sed替换为文件中文本的完全匹配

时间:2016-03-09 08:39:16

标签: bash sed match

我有一个文件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'

这最后一个命令显示&#34; foo&#34;。 $ searchEscaped似乎被正确转义。 虽然,这不会返回任何东西(它应该显示foo +文件的其余部分没有匹配的部分):

sed -n "s/$searchEscaped/foo/p" targetfile.txt

1 个答案:

答案 0 :(得分:0)

我认为最好的解决方案是根本不使用正则表达式并使用字符串替换。

一种方法是使用perl:

$ echo "$string_to_replace"
some other stuff abc$^%!# some more
$ echo "$search"
abc$^%!#
$ perl -spe '$len = length $search; 
while (($pos = index($_, $search, $n)) > -1) { 
    substr($_, $pos, $len) = "replacement"; 
    $n = $pos + $len; 
}' <<<"$string_to_replace" -- -search="$search"
some other stuff replacement some more

-p开关告诉perl循环遍历变量$string_to_replace的每一行(可以很容易地用文件替换)。 -s允许将选项传递给脚本 - 在这种情况下,我传递了一个包含搜索字符串的shell变量。

对于文件的每一行,while循环遍历搜索字符串的所有匹配项。分配的左侧使用substr来替换$_的子字符串,该字符串引用正在处理的当前行。