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