【问题标题】:fedora sed command replace special charactersfedora sed 命令替换特殊字符
【发布时间】:2015-02-16 23:48:11
【问题描述】:

我对 sed 完全陌生,作为脚本编写的一部分,我正在尝试替换字段中的特定字符串。我知道特殊字符需要使用反斜杠进行转义,但问题是如果特殊字符在行中的第一个,那么它不会被替换....

例如,我的文件包含

sldgfkls $bdxcv sldflksd

现在如果我写下面的代码

sed -i 's/\b\$bdxcv\b/abcd/' filename

那么上面的词不被替换....但是如果文件中包含

sldgfkls a$bdxcv sldflksd

现在如果我写下面的代码

sed -i 's/\ba\$bdxcv\b/abcd/' filename

然后上面的词被替换..... 请在这里帮我....

【问题讨论】:

    标签: linux bash sed


    【解决方案1】:

    显然,\b 不会将美元符号视为单词字符,因此空格和$ 之间没有单词边界来匹配。

    也许你想要这个:

    sed -i 's/\(^\|[\t ]\)\$bdxcv\b/\1abcd/' filename
    

    假设您的是 GNU sed,请参阅包含此定义的 https://www.gnu.org/software/sed/manual/sed.html

    “单词”字符是任何字母或数字或下划线字符。

    因此不是美元符号。

    【讨论】:

    • 谢谢.....我正在使用 \b 以便只替换完全匹配而不是部分匹配.....上面的选项是这样做的吗?仅替换完全匹配..
    • 是的,它会查找前面有行首或空格的匹配项。如果你还需要在标点符号后替换,只需将你想要的字符添加到当前包含制表符和空格的字符类中即可。
    • 现在我的第二个问题是文件格式存储文件,最后一件事是 lr(newline feed) 和 cf(Carraige return)....所以我要替换的字符串以它结尾..所以我可以在第二个 \b.... 中使用它吗??
    • '\1` 包含捕获的第一组括号。谷歌backrefs
    • 没试过,但我相信\b应该匹配单词字符和回车\r
    【解决方案2】:

    sed 不能操作字符串,只能操作正则表达式。试图找出哪些字符需要转义以禁用它们的正则表达式(或 sed 分隔符或 sed 反向引用)意味着使 sed 中的正则表达式表现得好像它是一个字符串是愚蠢的差事,只需使用可以对字符串进行操作的工具,例如哎呀。

    $ awk '{for (i=1;i<NF;i++) if ($i == "$bdxcv") $i="abcd"} 1' file
    sldgfkls abcd sldflks
    

    以上使用字符串比较和字符串赋值 - 无需转义任何内容,除非其中一个字符串包含字符串分隔符 "

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 2019-09-07
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多