sed如何只在第一行匹配后插入内容?

8

尝试做到这一点:

sed -e '/^MatchMeOnce/i\
MATCHED'

在这个示例文本中:
Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6

如何仅匹配第一个记录出现,并且在后续行中匹配?

Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6

1
这回答解决了你的问题吗?[如何使用sed仅替换文件中的第一个匹配项?] (https://dev59.com/RHVC5IYBdhLWcg3w51ry) - rogerdpack
4个回答

7
这可能对你有用:
sed '1,/MatchMeOnce/s//MATCHED/' file

只要“MatcMeOnce”在第二行或更高行,或使用GNU sed,这将适用于所有变体的sed。
sed '0,/MatchMeOnce/s//MATCHED/'  file

适用于以上边缘情况的解决方案:

或者另一种选择(所有sed命令),它将整个文件都读入内存中:

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/' file

这种方法的优势在于,如果你想选择第n个而不是第一个MatchMeOnce,你只需要更改出现标识即可,例如更改为第二次出现:

sed ':a;$!{N;ba};s/MatchMeOnce/MATCHED/2' file

为了更改最后一次出现,请使用:
sed ':a;$!{N;ba};s/\(.*)MatchMeOnce/\1MATCHED/' file

2

sed(不太显然):

sed '1,/^MatchMeOnce$/ {/^$/\c
MATCHED
}'

awk(显而易见):

BEGIN {
    matched = 0
}
/^MatchMeOnce$/ {
    if (matched == 0) {
        print "MATCHED"
        matched = 1
        next
    }
}
{ print }

Perl也很酷...

希望它多多少少能工作 :-)


1
$ sed '/MatchMeOnce/{s//MATCHED/;:a;n;ba}' input.txt
Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6

1

GNU sed有一个t命令,可以在任何替换匹配时分支到脚本的结尾(或给定标签)。

个人使用perl -neperl -ane(我想有些人会使用Ruby),除非awk或sed解决方案显而易见。但我意识到一些系统可能不带有Perl的awk和sed,安装Perl可能很困难;并且一些程序员仍然更喜欢awk和sed。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接