sed 匹配模式并在 x 行之后执行

sed 匹配模式并在 x 行之后执行

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

sed '/\/Some\/Foo\/Bar\/String/' config.file

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

foo { '/Some/Foo/Bar/String' :
    key1 => value1,
    key2 => value2,
    key3 => value3,
    key4 => value4,
    key5 => value5,
}

sed 命令后的结果

#foo { '/Some/Foo/Bar/String' :
#    key1 => value1,
#    key2 => value2,
#    key3 => value3,
#    key4 => value4,
#    key5 => value5,
#}

答案1

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,
#}

细节

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

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

  • s/^/#/

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

相关内容