2012-03-02 15 views
48

Jestem nowy w sed i mam następujące pytanie. W tym przykładzie:sed usuń linie nie zawierające określonego ciągu znaków

some text here 
blah blah 123 
another new line 
some other text as well 
another line 

chcę usunąć wszystkie wiersze z wyjątkiem tych, które zawierają albo ciąg „tekst” i lub string „bla”, więc mój plik wyjściowy wygląda następująco:

some text here 
blah blah 123 
some other text as well 

Wszelkie wskazówki, jak można to zrobić za pomocą sed?

+3

odpowiedź używa sed? grep zrobiłby to bardzo łatwo. – Tim

Odpowiedz

11

Chcesz wydrukować tylko te wiersze, które pasują albo "tekst", albo "bla" (lub oba), gdzie rozróżnienie między "i" i "lub" ma kluczowe znaczenie.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file 

Środki -n nie są drukowane domyślnie. Pierwszy wzorzec wyszukuje "tekst", drukuje go po dopasowaniu i przechodzi do następnego wiersza; drugi wzór robi to samo dla "bla". Jeśli "n" nie było tam, to wiersz zawierający tekst i bla zostałby wydrukowany dwukrotnie. Chociaż mógłbym użyć tylko -e '/blah/p', symetria jest lepsza, szczególnie jeśli potrzebujesz rozszerzyć listę dopasowanych słów.

Jeśli wersja sed obsługuje rozszerzonych wyrażeń regularnych (na przykład, GNU sed robi, z -r), to można uprościć, że aby:

sed -r -n -e '/text|blah/p' your_data_file 
+3

Jeśli sed nie obsługuje '-r', prawdopodobnie nie będzie obsługiwał' {} '. Powinno to działać ze starszymi seds: 'sed '/ text \ | blah /! D' file' –

+0

Grupowanie komend' {...} 'było w wersji 7 wydania UNIX' sed'; Nie mogę pomyśleć, w jaki sposób natknąłeś się na wersję, która nie była obsługiwana. –

79

To może pracować dla Ciebie:

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

Dzięki, że działa. – user1246172

+1

Jak mogę na przykład określić, że tekst lub bla może pojawić się tylko w ostatniej kolumnie? – discipulus

+2

@lovedynasty Jeśli masz na myśli * na końcu linii *, powinieneś użyć '$': ''/ text $ \ | blah $ /! D'' – Melebius

5

Po prostu możesz to zrobić przez awk,

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well 
Powiązane problemy