2013-06-28 15 views
12

Sto usando sed per filtrare un elenco di file. Ho un elenco ordinato di cartelle e voglio ottenere tutte le linee dopo una specifica. Per eseguire questa operazione, sto utilizzando la soluzione descritta here che funziona molto bene con qualsiasi input che ho provato ma non funziona quando la corrispondenza è nella prima riga. In tal caso sed rimuoverà tutte le linee di ingressoRimuovere tutte le righe prima di una partita con sed

qui è un esempio:

(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 

Come dovrei cambiare il comando di prendere in considerazione anche il caso limite in cui prima linea è accompagnata da espressioni regolari?

BTW sed '1,1d' funziona correttamente e rimuove solo la prima riga.

+0

Grazie per un commento. Corretto e aggiunto poche altre soluzioni. – jm666

risposta

14

provate questo (GNU sed solo):

sed '0,/^bin$/d' 

..output è:

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

Questa sembra l'opzione migliore. Ho visto la tua risposta precedente che afferma che funziona per GNU sed, ora l'hai rimosso. Sto usando GNU sed, quindi per me questa è la risposta giusta, ma solo per curiosità, funzionerà per non GNU sed? – Fabio

+0

non c'è un comando specifico per GNU, dovrebbe funzionare, mi ha detto il mio libro di testo. – Endoro

+0

Non funziona su OS X sed, ma come ti ho detto ne ho bisogno su un sistema GNU. – Fabio

11

Questo comando sed stampa tutte le linee dopo e tra cui la linea di matching:

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

L'interruttore -n effettua la stampa sed solo se indicato (Comando).

Se non si desidera includere la riga corrispondente si può dire sed per eliminare dall'inizio del file alla riga corrispondente: (. Usiamo il comando d che cancella le righe)

sed '1,/^WHATEVER$/d' 

+0

Ho esplorato anche questa opzione e ho smesso a causa dell'inclusione della linea corrispondente. Ho perso l'opzione 'tail -n + 2'. Quindi anche questo è buono. Grazie. – Fabio

+0

Mi hai salvato la giornata. Molto semplice da capire e pieno funzionale. Sicuramente la migliore risposta se la linea corrispondente deve essere inclusa. – jmcollin92

4

si può anche provare con:

awk '/searchname/{p=1;next}{if(p){print}}'