【问题标题】:SED not matching optional double quotes (")SED 不匹配可选的双引号 (")
【发布时间】:2018-03-17 13:22:36
【问题描述】:

我正在尝试编写一个 bash 脚本来将单词 Test 插入到以 AlarmName 开头的任何行: 示例:

AlarmName: "Blah"

变成

AlarmName: "TestBlah"

双引号是可选的,这是我目前的命令

's/\(AlarmName:\s*("?)\([^"]*\)"?\)/<WHAT GOES HERE>/g' blah.txt > blah2.txt

我遇到了两个问题,第一个是我似乎无法让 SED 匹配可选引号。第二个问题是我不确定如何修改捕获组中的文本

【问题讨论】:

    标签: bash sed


    【解决方案1】:

    应该这样做:

    sed -E 's/^AlarmName:\s*"?/&Test/' file
    

    匹配前缀部分 AlarmName: " 并将其替换为 self 的副本(&amp; 部分)并附加 Test 文本就足够了。

    或者,如果您更喜欢纯粹的POSIX BRE

    sed 's/^AlarmName:[[:space:]]*"\{0,1\}/&Test/' file
    

    【讨论】:

    • 谢谢 我不知道 & 运算符有多棒
    • 快速提问,这在我做一个小文件时有效,但是当我用一个大文件尝试它时,我收到以下错误“sed: 1:”s/AlarmName:[[:space:]] ...":RE 错误:重复计数无效"有什么想法吗?
    • 这很奇怪,如果你弄清楚了,错误是什么?
    【解决方案2】:

    您可以执行以下操作:

    sed 's|^\(AlarmName\s*:\s*\)\("*\)\([^"]*\)\("*\)|\1\2Test\3\4|'
    

    您将输入分成四个部分(\1\2\3\4),其中: \1 代表AlarmName: 前缀, \2代表可选引号, \3 表示要添加 Test 的字符串,并且 \4 代表右大括号。

    注意每个组开始/结束大括号之前的\(您在上面的尝试中错过了一些)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-24
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多