2009-04-11 22 views
9

Czytam z linii, która ma około 500 znaków. Jak mogę uzyskać sed, zamiast zastąpienia tego ciągu czymś, zastąpić resztę linii czymś? Krótko mówiąc, chcę usunąć cały tekst wokół określonego ciągu. Usuwanie kolumn za pomocą awk nie będzie działać, ponieważ istnieje nieokreślona ilość znaków przed i po dopasowanym łańcuchu. Jakieś pomysły?Jak odwrócić wyjście sed?

Odpowiedz

10

Spróbuj użyć powrotem referencje:

sed 's/.*\(searchstring\).*/___\1___/' 

W .* „s wokół szukanego ciągu będą pasować wszystko oprócz napisu, a nawiasy powiedzieć sed sobie przypomnieć, co to dopasowane. Możesz odnieść się do pierwszego dopasowanego ciągu znaków za pomocą \1.

Oto przykład (zastępując wszystko, ale 'bar baz'):

$ echo "foo bar baz qux" | sed 's/.*\(bar baz\).*/___\1___/' 
___bar baz___ 

można zastąpić 'bar' z baz wzór cokolwiek chcesz w wyżej; Po prostu użyłem podstawowego ciągu dla uproszczenia.