sed - come rimuovere tutte le righe che non corrispondono


12

Ho un file html. Voglio rimuovere tutte le righe che non iniziano con <tr>.

Provai:

cat my_file | sed $'
s/^[^tr].*//
' | sed '/^$/d'

ma ha eliminato tutte le righe.


3
Più facile con grep.
jcbermu,

1
s/^[^tr]...corrisponde alle righe che iniziano con qualsiasi carattere diverso da to r. Le parentesi quadre sono un intervallo di caratteri in una regex.
Peter Cordes,

Risposte:


19

Prova questo con GNU sed:

sed -n '/^<tr>/p' file

o

sed '/^<tr>/!d' file

1
Trovo la versione !dparticolarmente utile perché ti permette di scrivere un altro comando sed all'interno dell'espressione, mentre l' punico stampa la corrispondenza, ma il comando successivo ha l'input invariato.
jirislav,

9
sed -e '/^<tr>/d'

La parte tra /è una regex. Il dcomando elimina le linee corrispondenti.

Aggiornamento: oops, mi dispiace di averti visto NON detto. Così

sed -e '/^<tr>/!d'

Dove !nega il senso della partita.


3

Se deve essere sed:

sed -ni '/^<tr>/p' file

-imodifica il file sul posto, -nimpedisce seddi stampare tutte le linee, l'espressione regolare significa che corrisponde a tutte le linee che iniziano ( ^) con <tr>e quelle linee verranno stampate ( p).

Con grep:

grep -E '^<tr>' file

Con -Egrep interpreta espressioni regolari estese.

Con awk:

awk '/^<tr>/' file

O puro bash:

while IFS= read -r l; do [[ "$l" =~ ^\<tr\> ]] && echo $l; done <file

L' [[espressione condizionale interna è bashs. Confrontiamo $lcon l'espressione regolare e se ha successo ( &&) stampiamo la linea con echo.


La tua versione pure-bash non riesce a citare "$l". E lo stai inserendo come primo argomento nella echoriga di comando, quindi avrai un problema se inizia con a -option. (Usa printf '%s\n' "$l"). Also, shell read` deve leggere un byte alla volta, quindi è super lento. L'elaborazione di file di testo in bash puro di solito non è una buona scelta a meno che tu non sappia che il tuo file è molto piccolo.
Peter Cordes

2

La risposta più semplice e semplice sarebbe:

grep '^<tr>' path/to/file 

Questo stamperà il file con solo le righe che iniziano con cui potrebbe essere utile se non si desidera modificare direttamente il file (come con sed).

Quindi, se ti piace quello che vedi nell'output, puoi semplicemente stampare su un file con > file

In questo caso risparmi un po 'di tempo eseguendo il backup del file prima di provare alcuni comandi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.