2013-06-28 13 views
12

Używam sed do filtrowania listy plików. Mam posortowaną listę folderów i chcę uzyskać wszystkie wiersze po określonej. Aby wykonać to zadanie, używam rozwiązania opisanego jako here, które działa całkiem dobrze z każdym wprowadzonym przeze mnie wejściem, ale nie działa, gdy mecz jest w pierwszym wierszu. W takim przypadku sed usunie wszystkie linie wejściaUsuń wszystkie linie przed meczem z sed

Tutaj przykład:

(ssh) [email protected] : ~ 
[0] % ls -1/
bin 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/tmp/d' 
usr 
var 
vmlinuz 

(ssh) [email protected] : ~ 
[0] % ls -1/| sed '1,/^bin$/d' 
# sed will delete all lines from the input stream 

Jak należy zmienić polecenie, aby rozważyć również przypadek krańcowy gdy pierwsza linia pasuje do regexp?

BTW sed '1,1d' działa prawidłowo i usuwa tylko pierwszy wiersz.

+0

Dziękuję za komentarz. Poprawiono i dodano kilka innych rozwiązań. – jm666

Odpowiedz

14

spróbować (GNU sed tylko):

sed '0,/^bin$/d' 

..output jest:

 
$sed '0,/^bin$/d' file 
boot 
... 
sys 
tmp 
usr 
var 
vmlinuz 
+0

To wydaje się najlepszą opcją. Widziałem twoją poprzednią odpowiedź, która stwierdza, że ​​działa dla GNU sed, teraz to usunąłeś. Używam GNU sed, więc dla mnie jest to właściwa odpowiedź, ale tylko dla ciekawości, czy zadziała dla non GNU sed? – Fabio

+0

nie ma konkretnego polecenia GNU, powinno działać, powiedział mi mój podręcznik tekstowy. – Endoro

+0

To nie działa na OS X sed, ale jak już powiedziałem, potrzebuję go w systemie gnu. – Fabio

11

Polecenie sed drukuje wszystkie linie po włącznie pasującej linii:

sed -n '/^WHATEVER$/,$p' 

Przełącznik -n powoduje, że drukowanie sed jest drukowane tylko po jego wyświetleniu (p polecenie).

Jeśli nie chcesz dołączyć wiersz pasujący można powiedzieć sed usunąć z początku pliku do linii pasującej: (. Używamy polecenia d który usuwa linie)

sed '1,/^WHATEVER$/d' 

+0

Zbadałem również tę opcję i zrezygnowałem z powodu włączenia pasującej linii. Brakowało mi opcji 'tail -n + 2'. Jest to również dobre. Dzięki. – Fabio

+0

Uratujesz mój dzień. Bardzo proste do zrozumienia i pełne fonctional. Na pewno najlepsza odpowiedź, jeśli pasująca linia powinna zostać uwzględniona. – jmcollin92

4

można też spróbować z:

awk '/searchname/{p=1;next}{if(p){print}}' 
Powiązane problemy