尝试做到这一点:
sed -e '/^MatchMeOnce/i\
MATCHED'
在这个示例文本中:
Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6
如何仅匹配第一个记录出现,并且不在后续行中匹配?
Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
sed '1,/MatchMeOnce/s//MATCHED/' file
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
sed
(不太显然):
sed '1,/^MatchMeOnce$/ {/^$/\c
MATCHED
}'
awk
(显而易见):
BEGIN {
matched = 0
}
/^MatchMeOnce$/ {
if (matched == 0) {
print "MATCHED"
matched = 1
next
}
}
{ print }
Perl
也很酷...
希望它多多少少能工作 :-)
$ sed '/MatchMeOnce/{s//MATCHED/;:a;n;ba}' input.txt
Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
GNU sed有一个t
命令,可以在任何替换匹配时分支到脚本的结尾(或给定标签)。
个人使用perl -ne
和perl -ane
(我想有些人会使用Ruby),除非awk或sed解决方案显而易见。但我意识到一些系统可能不带有Perl的awk和sed,安装Perl可能很困难;并且一些程序员仍然更喜欢awk和sed。