【问题标题】:Bash sed replace with exact match of a text in a fileBash sed 替换为文件中文本的完全匹配
【发布时间】: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" &lt;&lt;&lt;"$search" # if ok, echoes 'foo' 之前效果很好,然后我尝试sed -i "s/$searchEscaped//g" targetfile.txt 但没有成功
  • 您正在使用-n 这会抑制 sed 的输出。你能显示你的输入文件吗?

标签: bash sed match


【解决方案1】:

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

一种方法是使用 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 用在赋值的左边,用来替换$_ 的子串,它指的是当前正在处理的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-21
    • 2017-06-01
    • 2022-12-11
    • 1970-01-01
    • 2022-01-24
    • 2013-04-30
    • 2021-08-30
    相关资源
    最近更新 更多