2012-10-22 11 views

Odpowiedz

10

Można zrobić to w ten sposób:

sed -e 's/^avpgw/new text/' -e t -e 's/^av/new text/' -e t -e 's/^/new text/' file 

Zastępuje to wzór z new text (s ///) i skacze do końca (t). W przeciwnym razie próbuje następnego wzoru. Zobacz także sed commands summary.

Można również oddzielić poleceń z ;:

sed 's/^avpgw/new text/; t; s/^av/new text/; t; s/^/new text/' file 

lub umieścić polecenia w sed pliku polecenia:

s/^avpgw/new text/ 
t 
s/^av/new text/ 
t 
s/^/new text/ 

i nazywają to w ten sposób:

sed -f commandfile file 

Jeśli chcesz zignorować wielkość liter, dołącz element i na końcu polecenia zastępczego, tak jak w s/^av/new text/i. Innym sposobem jest przeliterowanie za pomocą zestawów znaków s/^[aA][vV]/new text/. Ale to nie jest specyficzne, ponieważ można wyszukiwać wyrażenia regularne w ogóle.

+0

Dzięki za odpowiedź. Wszystko działało idealnie. Czy istnieje sposób na uczynienie go niewrażliwym na wielkość liter. Mam na myśli Av, AV, av itd. Wszystkie powinny zostać zastąpione. – user1765709

+0

@ user1765709 Możesz użyć zestawów znaków lub dodać modyfikator. Zobacz moją zmodyfikowaną odpowiedź. –

+0

Jestem na centach i to nie działa. Jakiś pomysł, dlaczego? – Dobler

1

To może pracować dla Ciebie (GNU sed):

sed -r 's/^av(pgw)?.*/replacement/;t;s/^/replacement /' file 
+0

Czy '(pgw) {, 1}' będzie lepsze? –

+0

@JanitoVaqueiroFerreiraFilho dobry punkt. GNU sed udostępnia również opcjonalny metaznak '?', Który oznacza to samo 0 lub 1. Ale jeśli nie ma szans na napis 'avpgwpgw'' * 'jest w porządku. – potong

+0

Dzięki! Myślę, że wszystko zależy od tego, jak bardzo możemy zaufać input =) –

Powiązane problemy