2012-03-27 48 views
6

试图做到这一点:仅在第一行匹配后插入sed?

sed -e '/^MatchMeOnce/i\ 
MATCHED' 
的示例文本

Line1 
Line2 
MatchMeOnce 
Line4 
MatchMeOnce 
Line6 

我怎样才能得到它只匹配最开头的记录发生,并比赛在随后的行?

Line1 
Line2 
MATCHED 
Line4 
MatchMeOnce 
Line6 

回答

1

GNU SED具有t命令分支到脚本的端(或者给定的标记物)的任何取代时匹配。

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

2

sed(不是很明显):

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

awk(明显):

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

perl也很酷...

希望或多或少的作品:-)

+1

sed:-e表达式#1,字符24:未知命令:'\' – kev 2012-03-27 05:41:55

2
$ sed '/MatchMeOnce/{s//MATCHED/;:a;n;ba}' input.txt 
Line1 
Line2 
MATCHED 
Line4 
MatchMeOnce 
Line6 
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所有你需要做1日起,在该额外的好处是改变发生标志即改变第二次出现:

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

要改变最后一次使用:

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