Come si eliminano tutte le righe in un file a partire da una riga corrispondente?


87

Ho un file composto da più righe di testo:

The first line
The second line
The third line
The fourth line

Ho una stringa che è una delle righe: The second line

Voglio eliminare la stringa e tutte le righe successive nel file, quindi verrà eliminata The third linee The fourth linein aggiunta alla stringa. Il file diventerebbe:

The first line

Ho cercato una soluzione su Google e sembra che dovrei usare sed. Qualcosa di simile a:

sed 'linenum,$d' file

Ma come trovare il numero di riga della stringa? Oppure, come dovrei farlo altrimenti?


1
La tua affermazione del problema è contraddittoria: "Voglio eliminare tutte le righe dopo la riga" significa che elimini solo due righe (come dici tu), ma poi l'output di esempio mostra anche la riga di corrispondenza mancante. Quale vuoi davvero?
Jonathan Leffler

La linea di corrispondenza E tutte le linee successive. Dovrei migliorare il mio inglese. Grazie per le informazioni.
DocWiki


Se non voglio eliminare la riga che cerco, come si fa?
byhuang1998

Risposte:


139

Se non desideri stampare la riga corrispondente (o le righe seguenti):

sed -n '/The second line/q;p' inputfile

Questo dice "quando raggiungi la riga che corrisponde allo schema esci, altrimenti stampa ogni riga". L' -nopzione impedisce la stampa implicita e il pcomando è necessario per stampare esplicitamente le righe.

o

sed '/The second line/,$d' inputfile

Questo dice "cancella tutte le righe dall'output a partire dalla riga corrispondente e continua fino alla fine del file".

ma il primo è più veloce. Tuttavia terminerà completamente l'elaborazione, quindi se hai più file come argomenti, quelli dopo il primo file corrispondente non verranno elaborati. In questo caso, il modulo di cancellazione è migliore.

Se vuoi stampare la riga corrispondente, ma non le righe seguenti:

sed '/The second line/q' inputfile

Questo dice "stampa tutte le righe ed esci quando viene raggiunta la riga corrispondente" (l' -nopzione (nessuna stampa implicita) non è usata).

Vedere man sed per ulteriori informazioni.


3
Ma alcuni comandi si innervosiscono per i tubi rotti (RCS co -pper esempio), e quindi stai meglio con la sed '/The second line/,$d'notazione.
Jonathan Leffler

Puoi aggiungere delle spiegazioni?
Ahmad Abdelghany

@AhmadAbdelghany: spiegazioni aggiunte.
Dennis Williamson

@DennisWilliamson Grazie mille.
Ahmad Abdelghany

il primo metodo stampa due volte l'ultima riga prima della riga corrispondente. cancellando i ppost ;lavori.
CrazyFrog,

28

Questo è un po 'più breve di altre soluzioni fornite. Esci usando la Q maiuscola evita di stampare la riga corrente.

 sed '/The second line/Q' file

Per eliminare effettivamente le righe è possibile utilizzare la stessa sintassi.

 sed -i '/The second line/Q' file

2
Questa è di gran lunga la mia soluzione preferita.
Try TryAgain

5
sed '/The second line/q0' file

Oppure, senza gnu sed:

sed '/The second line/q' file

Oppure, usando grep:

grep -B 9999999 "The second line"

Grazie mille! Puoi dirmi come posso trovare il numero di riga di una stringa specifica, che ancora non conosco.
DocWiki

grep -n "La seconda riga" file | awk -F: "{print $ 1}"
Erik

@DocWiki: non hai bisogno del numero di riga; lo cerchi. sed "/$string/,\$d" inputfile.
Jonathan Leffler

5

Usare awk (non mostra la linea abbinata)

awk '/pattern/ {exit} {print}' file.txt

Questa è la risposta migliore, poiché potresti non conoscere il valore della seconda riga.
RonJohn

0

Per prima cosa aggiungi il numero di riga ed elimina la riga

cat new.txt 
The first line
The second line
The third line
The fourth line

 cat new.txt  | nl
     1  The first line
     2  The second line
     3  The third line
     4  The fourth line



cat new.txt  | nl | sed  "/2/d"
     1  The first line
     3  The third line
     4  The fourth line

cat new.txt  |  nl |sed  "3d;4d"
     1  The first line
     2  The second line

usando awk

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line

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.