【问题标题】:sed (or awk) regular expression to replace substring of matchsed(或 awk)正则表达式替换匹配的子字符串
【发布时间】:2013-01-23 14:33:27
【问题描述】:

我有一个包含以下内容的文本文件(“file.txt”):

#   disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

我需要使用 GNU Sed 切换这 3 行中的哪一行(“有利”、“基础”或“不利”)被注释掉。

我知道我可以将“有利”行与如下代码匹配(作为一个虚拟示例,我只是将文本替换为“aaa”):

$ cat file.txt | sed -r 's/#[\t]disutil_screening[\ =0-9\.;]+# favorable/aaa/'
aaa
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

但是,这个示例 Sed 语句显然与我真正想要的相差甚远。我需要一个只会删除前导“#”的 Sed 表达式。也就是说,我需要一个 Sed 表达式($EXPR),使得如上所示的“file.txt”的内容修改如下:

$ cat file.txt | sed -r $EXPR
    disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

一旦我知道如何执行此操作(将“有利”行的前导“#”替换为“”),那么我相信我可以弄清楚如何将“#”添加到“基本”行(即注释掉当前未注释掉的行)。

注意:我愿意在这个任务中使用 awk 而不是 sed,但我对 awk 有点害怕,以前从未使用过它。

【问题讨论】:

  • 仅供参考:实际上,文本文件中有许多不同的disutil_* 语句。但是出于这个问题的目的,我只是假设唯一的一个是disutil_screening。实际上有disutil_biopsydisutil_surgery等。因为有很多disutil,我需要使注释行的切换自动化。

标签: regex sed awk


【解决方案1】:

使用 awk

awk -F= '$2 ~ / favorable/{sub("#","")}1' temp.txt

输出

   disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

【讨论】:

    【解决方案2】:

    这就是我想出的。请注意,-i 使替换内联(即您的原始文件将被更改)。

    $ sed -i 's/^#\(.*# favorable\)$/ \1/' text.txt
    

    【讨论】:

    • 谢谢。我很高兴看到您的答案通过在不使用 -r 选项时演示捕获组的语法来补充 AlexAtNet 的答案。我从这两种方式中学到了更多:)
    【解决方案3】:

    我认为您需要的是分组。试试这个:

    $ cat file.txt | sed -r 's/#([\t]disutil_screening[\ =0-9\.;]+# favorable)/\1/'
    

    我将所有匹配项(除了第一个评论字符)包装到组中,然后将整个匹配项替换为该组,因此第一个字符被删除。

    【讨论】:

    • 啊,所以对于注释掉当前未注释的行的情况,我可以做这样的事情,对吧? 's/^([\t]disutil_screening[\ =0-9\.;]+# favorable)/#\1/'
    • 谢谢,这正是我所需要的!
    • 当我使用你的 sed 表达式但添加了-i 选项时,我得到了错误:invalid reference \1 on `s' command's RHS
    • 如果你使用 -r 你不需要转义括号。我怀疑你正在转义括号,所以 \1 正在寻找一个不存在的组。
    • 我没有逃避括号。这是我正在使用的命令:sed -ir 's/#([\t]disutil_screening[\ =0-9\.;]+# unfavorable)/\1/' file.txt
    猜你喜欢
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 2018-07-28
    • 2012-01-25
    相关资源
    最近更新 更多