Sed вставить после ТОЛЬКО матча первой линии?

Попытка сделать это:

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

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

Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6

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

Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
4 ответа

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

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-е, а не 1-е из MatchMeOnce, все, что вам нужно, это изменить флаг появления, т.е. изменить второе вхождение:

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

Чтобы изменить последнее использование, используйте:

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


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


sed (не так очевидно):

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

awk (очевидно):

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

perl тоже классно...

Надеюсь, что он работает более или менее: -)


GNU sed имеет команду t для ветвления до конца script (альтернативно данная метка), когда любая подстановка совпадает.

Лично я использую perl -ne и perl -ane (и я полагаю, что некоторые люди используют Ruby), если решение awk или sed не ослепительно очевидно. Но я понимаю, что для некоторых систем все еще возможно иметь awk и sed без Perl и затруднять установку Perl; и что некоторые программисты предпочитают awk и sed независимо.

licensed under cc by-sa 3.0 with attribution.