【问题标题】:Replacing first occurence except comments using sed使用 sed 替换除注释外的第一次出现
【发布时间】:2016-10-18 20:44:45
【问题描述】:

我有一个文本文件,格式如下:

a = 1
#b = [2,3]
c = 4
d = [5,6]
e = [7,8]

我想用数字替换括号(和括号)内的模式,但忽略 cmets 中的匹配项,最好使用 sed。

对于只有一个匹配行的文件,我使用过

sed -i "/^#/!s/\[.*\]/9/" myfile

如果有更多匹配项,如何修改以仅替换第一个匹配项?

【问题讨论】:

    标签: sed command-line text-processing


    【解决方案1】:

    这是正确的,因为只改变了第一次出现。

    awk '!end && /^[^#]+ = \[/ {$3="9"; end=1}1' myfile

    • 如果没有结束标志并且行不是从#开始并且匹配到= [,则更改第三列并设置标志以防止下次发生更改。

    a = 1

    #b = [2,3]

    c = 4

    d = 9

    e = [7,8]

    【讨论】:

    • “e”的值不是从样本数据中处理的。
    • 它不应该,不是吗?正如作者所说如果有更多匹配项,如何修改以仅替换第一个匹配项? ??
    • 谢谢!这完全符合我在问题中提出的要求。但是,如果 '=' 左侧有多个字符,则它不起作用。有什么想法吗?
    • 当然,我已经完成了 - 将 + 添加到正则表达式 [^#]+ 它应该可以工作,请检查一下。
    【解决方案2】:

    这个单线应该可以完成这项工作:

    sed  '/^\s*#/!{s/\[[^]]*\]/9/}' file
    

    如果您想就地进行更改,请添加 -i 选项。

    【讨论】:

      猜你喜欢
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 2015-05-30
      • 2016-12-22
      相关资源
      最近更新 更多