【发布时间】: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_biopsy、disutil_surgery等。因为有很多disutil,我需要使注释行的切换自动化。