2

我有一个包含以下内容的文本文件(“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

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

一旦我知道如何做到这一点(用“”替换“有利”行的前导“#”),那么我相信我可以弄清楚如何在“base”行中添加“#”(即注释掉行目前没有被注释掉)。

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

4

3 回答 3

6

我认为你需要的是所谓的分组。试试这个:

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

我将所有匹配项(期望第一个评论字符)包装到组中,然后用该组替换整个匹配项,以便删除第一个字符。

于 2013-02-07T22:29:19.590 回答
4

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

$ sed -i 's/^#\(.*# favorable\)$/ \1/' text.txt
于 2013-02-07T22:33:26.833 回答
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
于 2013-02-08T01:43:54.057 回答