如何使用sed仅替换特定范围的正则表达式匹配?

时间:2017-02-09 01:12:28

标签: regex sed

使用sed,您可以通过执行以下操作来替换所有匹配项:

sed 's/match/replace/g'

或者您可以通过执行以下操作来仅替换第N个匹配:

sed 's/match/replace/N'

然后将这两者结合起来有未指明的行为(但至少会替换Bash中的> = Nth匹配):

sed 's/match/replace/gN'

但有没有办法替换< =第N个匹配或特定范围的匹配(例如从N 1 到N 2 )?我需要像Perl这样的更好的东西吗?

2 个答案:

答案 0 :(得分:0)

假设此输入文件:

aaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbb

现在试试这个:

sed '/a/{s/$/####/;:l;s/a/x/3;:t;tt;s/#//;tl}'

如果该行包含匹配项,请在该行的末尾添加一些字符串以用作计数器。开始循环并替换您感兴趣的第一个匹配项(在此示例中为第三个匹配项)。重置条件并从计数器中切断一个项目。如果有东西要切断,请重新启动循环,否则退出。

答案 1 :(得分:0)

将所有> = N匹配替换为空字节:

sed 's/match/\x00/gN'

用你的替换替换所有匹配(AKA all< N匹配以前):

sed 's/match/replace/g'

将所有空字节替换回原始匹配:

sed 's/\x00/match/g'