【问题标题】:Sed command to replace a string with special charactersed命令用特殊字符替换字符串
【发布时间】:2016-09-28 02:16:05
【问题描述】:

所以我在一个包含特殊字符的文件中有下面一行,我想用另一行替换它。

文件中存在的行 -

'generic_raid': {'keys': 5 * (1000**3)

我想用它来替换上面的行-

'generic_raid': {'keys': 2

我正在使用下面的 sed 命令,但它不起作用,谁能帮忙

sudo sed -r -i "s/'generic_raid': \{'keys': 5 * (1000**3)/'generic_raid': \{'keys': 2/g" abc.py

【问题讨论】:

  • 转义花括号,*, (, )
  • 非常感谢 Avinash,它成功了。我使用了以下命令 - sudo sed -r -i "s/'generic_raid': \{'keys': 5 * (1000**3)/'generic_raid': \{'keys': 2/g" abc. py
  • 在紧要关头,如果您不确定是否需要转义某些内容,可以将字符放入方括号中。 [*] 匹配 *[{] 匹配 {
  • 要扩展 Avinash 的评论,this regexr 是您的搜索模式 - 红色下划线是错误。
  • 感谢 ghoti & cxw 的建议,感谢您的建议。

标签: bash sed


【解决方案1】:

可以通过避免使用扩展正则表达式来简化,在这种情况下只需要转义*

$ cat ip.txt 
'generic_raid': {'keys': 5 * (1000**3)
$ sed "s/'generic_raid': {'keys': 5 \* (1000\*\*3)/'generic_raid': {'keys': 2/g" ip.txt 
'generic_raid': {'keys': 2

在这种情况下不需要,但如果 " 不受欢迎且 ' 具有模式特征,则可以使用 ascii 代码 \x27

$ sed 's/\x27generic_raid\x27: {\x27keys\x27: 5 \* (1000\*\*3)/\x27generic_raid\x27: {\x27keys\x27: 2/g' ip.txt 
'generic_raid': {'keys': 2

此外,具有\Q 功能的perl 解决方案在这些情况下很有帮助:

$ perl -pe "s/\Q'generic_raid': {'keys': 5 * (1000**3)/'generic_raid': {'keys': 2/" ip.txt 
'generic_raid': {'keys': 2

来自perldoc

返回带有所有 ASCII 非“单词”字符的 EXPR 的值 反斜杠。 (即所有 ASCII 字符不匹配 /[A-Za-z_0-9]/ 将在返回的字符串中以反斜杠开头, 无论任何区域设置如何。)

【讨论】:

  • 始终使用八进制 \047,从不使用十六进制 \x27 来表示单引号。见awk.freeshell.org/PrintASingleQuote。 YMMV 当然可以在 sed 中使用。
  • @EdMorton 它会影响sed吗? GNU sed 4.2.2对我没有影响
  • 你知道我不确定。我假设是这样,但我总是使用 '\'' 和 sed 所以 idk。
  • 在我离开评论之前没有看到您的编辑,搜索了一下,发现\x27 是常用的,例如:stackoverflow.com/questions/24509214/… ...虽然感谢您的警告,但会记住awk 或其他地方,如果有什么可疑的 :)
  • 不客气。不幸的是,在这个站点和其他站点上,您会发现许多示例支持使用您不应该实际做的所有事情,因为它们通常会为给定的示例输入产生预期的输出,并且只会在以后给定不同的输入时失败。在这种情况下,我个人会避免使用\x27,如果\047 对您不起作用,我会使用'\'',因为\x27s 在其他文本处理工具/情况下被证明是有问题的,但我想是YMMV。
【解决方案2】:

由于 sed 没有任何字符串操作,因此需要大量工作才能强制 sed 表达式表现得就好像它正在处理字符串一样(请参阅Is it possible to escape regex metacharacters reliably with sed),所以不要这样做。而是使用 awk,因为它支持字符串操作:

awk -v old="'generic_raid': {'keys': 5 * (1000**3)" \
    -v new="'generic_raid': {'keys': 2" \
       's=index($0,old){$0=substr($0,1,s-1) new substr($0,s+length(old))} 1' file
'generic_raid': {'keys': 2

【讨论】:

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