仅在第一行匹配后插入?

时间:2012-03-27 02:36:49

标签: unix sed

尝试这样做:

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

示例文字:

Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6

如何才能使其仅匹配第一个记录事件并在后续行上与匹配?

Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6

4 个答案:

答案 0 :(得分:7)

这可能对您有用:

sed '1,/MatchMeOnce/s//MATCHED/' file

这适用于sed的所有变体,只要MatcMeOnce在第二行或更高,或者这个(GNU sed):

sed '0,/MatchMeOnce/s//MATCHED/'  file

迎合上述边缘条件:

整个文件整理到内存中的另一种选择(所有sed')

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

它的另一个好处是,如果你想选择第n个而不是MatchMeOnce的第1个,你需要做的就是改变出现标志,即改变第二次出现:

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

要更改最后一次使用:

sed ':a;$!{N;ba};s/\(.*)MatchMeOnce/\1MATCHED/' file

答案 1 :(得分:2)

sed(不那么明显):

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

awk(显而易见):

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

perl也很酷......

希望它或多或少有效: - )

答案 2 :(得分:2)

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

答案 3 :(得分:1)

当任何替换匹配时,GNU sed有t命令分支到脚本结尾(或者给定标签)。

我个人使用perl -neperl -ane(我想有些人使用Ruby),除非awk或sed解决方案非常明显。但是我意识到某些系统仍然可以在没有Perl的情况下使用awk和sed,并且难以安装Perl;并且有些程序员更喜欢awk和sed。