2016-03-09 91 views
0

我有一个文件pattern.txt,它由一行非常长的复杂代码(〜8200个字符)组成。Bash sed替换为文件中文本的完全匹配

此代码可以在多个目录内的多个文件中找到。

我可以很容易地识别使用

grep -rli 'uniquepartofthecode' * 

我担心的是我怎么用确切的文本从文件中替换这些文件的列表?

我试图做的:

var=$(cat pattern.txt) 
sed -i "s/$var//g" targetfile.txt 

,但我得到了以下错误:

的sed:-e表达式#1,焦炭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 
+1

选中此项:http:// stackoverflow。com/questions/29613304/is-it-it-escape-regex-meta-characters-reliable-with-sed – hek2mgl

+0

很好用,直到 'sed -n“s/$ searchEscaped/foo/p”<<<“$ search “#if if,echo'foo'' 然后我尝试 'sed -i”s/$ searchEscaped // g“targetfile.txt' 但是没有成功 – TheTrueTDF

+0

您正在使用'-n'来取消sed的输出。你能显示你的输入文件吗? – hek2mgl

回答

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开关通过可变$string_to_replace的每一行(这可以很容易地由一个文件被替换)告诉Perl循环。 -s允许将选项传递给脚本 - 在这种情况下,我传递了包含搜索字符串的shell变量。

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