sed(或awk)正则表达式替换匹配的子串

时间:2013-02-07 22:23:26

标签: regex sed awk

我有一个文本文件(“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吓倒了,以前从未使用过它。

3 个答案:

答案 0 :(得分:6)

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

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

我将所有匹配期望第一个评论字符放入组中,然后将整个匹配替换为该组,以便删除第一个字符。

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

使用awk

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

输出

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