sed вставить после ТОЛЬКО совпадения первой строки? - PullRequest
7 голосов
/ 27 марта 2012

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

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

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

Line1
Line2
MatchMeOnce
Line4
MatchMeOnce
Line6

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

Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6

Ответы [ 4 ]

7 голосов
/ 27 марта 2012

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

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

Это будет работать для всех вариантов sed, если MatcMeOnce находится на 2-й строке или больше, или это (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
2 голосов
/ 27 марта 2012

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

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

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

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

perl тоже круто ...

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

2 голосов
/ 27 марта 2012
$ sed '/MatchMeOnce/{s//MATCHED/;:a;n;ba}' input.txt
Line1
Line2
MATCHED
Line4
MatchMeOnce
Line6
1 голос
/ 27 марта 2012

GNU sed имеет команду t для перехода к концу сценария (или заданной метке), когда подстановка соответствует.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...