2012-03-27 3 views
6

Попытка сделать это:sed вставить после ТОЛЬКО матч первой линии?

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

на примере текста:

Line1 
Line2 
MatchMeOnce 
Line4 
MatchMeOnce 
Line6 

Как я могу получить его, чтобы соответствовать только самое первое появление записи и не матч на последующих строках?

Line1 
Line2 
MATCHED 
Line4 
MatchMeOnce 
Line6 

ответ

1

GNU СЭД имеет t команду на ветку до конца сценария (в качестве альтернативы, учитывая метку), когда любая замена соответствует.

Лично я использую perl -ne и perl -ane (и, полагаю, некоторые люди используют Ruby), если решение awk или sed не ослепительно очевидно. Но я понимаю, что по-прежнему возможно, что некоторые системы имеют awk и sed без Perl и затрудняют установку 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, char 24: неизвестная команда: '\ ' – kev

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

Это может работать для вас:

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

Это будет работать для всех вариантов SED, пока MatcMeOnce находится на 2-й линии или больше, или это (GNU SED):

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

который обслуживает выше краевое условие:

Или другой альтернатива (все СЕПГ), которая хлебает весь файл в память:

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

, который имеет дополнительное преимущество в том, что если вы хотите выбрать п-й, а не 1 MatchMeOnce все, что нужно сделать, это изменить флаг вхождений т.е. изменить второе вхождение:

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

Чтобы изменить использование последнего использования:

sed ':a;$!{N;ba};s/\(.*)MatchMeOnce/\1MATCHED/' file 
Смежные вопросы