尝试这样做:
sed -e '/^MatchMeOnce/i\
MATCHED'
示例文字:
Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6
如何才能使其仅匹配第一个记录事件并在后续行上与不匹配?
Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
答案 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 -ne
和perl -ane
(我想有些人使用Ruby),除非awk或sed解决方案非常明显。但是我意识到某些系统仍然可以在没有Perl的情况下使用awk和sed,并且难以安装Perl;并且有些程序员更喜欢awk和sed。