sed 匹配模式并在 x 行之后进行操作

LF4*_*LF4 6 sed

我试图找到一种方法来注释掉配置文件中的块(多行)。我想匹配第一行,但之后也对每一行进行操作。

sed '/\/Some\/Foo\/Bar\/String/' config.file
Run Code Online (Sandbox Code Playgroud)

以下示例“代码”是我试图匹配和注释掉的内容。该块将始终以 } 结尾,但我也知道模式匹配后的行数,因此这将是模式行 + 6。

foo { '/Some/Foo/Bar/String' :
    key1 => value1,
    key2 => value2,
    key3 => value3,
    key4 => value4,
    key5 => value5,
}
Run Code Online (Sandbox Code Playgroud)

sed 命令后的结果

#foo { '/Some/Foo/Bar/String' :
#    key1 => value1,
#    key2 => value2,
#    key3 => value3,
#    key4 => value4,
#    key5 => value5,
#}
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 7

sed允许我们定义行的范围,然后仅在这些范围内应用替换。我们可以定义一个以包含行开始并以包含行Some/Foo/Bar/String结束的范围},然后应用替换命令来注释掉这些行:

$ sed '\|/Some/Foo/Bar/String|,/}/ s/^/#/' file
#foo { '/Some/Foo/Bar/String' :
#    key1 => value1,
#    key2 => value2,
#    key3 => value3,
#    key4 => value4,
#    key5 => value5,
#}
Run Code Online (Sandbox Code Playgroud)

细节

  • \|/Some/Foo/Bar/String|, /}/

    这定义了范围。它可以写成/\/Some\/Foo\/Bar\/String/, /}/但是,为了避免反斜杠,我用|作为分隔符来代替/第一个正则表达式。

  • s/^/#/

    这仅适用于范围内的行,并将它们注释掉。