web-dev-qa-db-fra.com

Comment puis-je supprimer toutes les lignes d'un fichier en commençant après une ligne correspondante?

J'ai un fichier composé de plusieurs lignes de texte:

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

J'ai une chaîne qui est l'une des lignes: The second line

Je veux supprimer la chaîne et toutes les lignes qui le suivent dans le fichier, ainsi il supprimera The third line et The fourth line en plus de la chaîne. Le fichier deviendrait:

The first line

J'ai cherché une solution sur google, et il semble que je devrais utiliser sed. Quelque chose comme:

sed 'linenum,$d' file

Mais comment trouver le numéro de ligne de la chaîne? Ou comment d'autre devrais-je le faire?

71
DocWiki

Si vous ne souhaitez pas imprimer la ligne correspondante (ou les lignes suivantes):

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

Ceci dit "lorsque vous atteignez la ligne correspondant au motif arrêté, sinon imprimez chaque ligne". L'option -n Empêche l'impression implicite et la commande p est requise pour imprimer explicitement des lignes.

ou

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

Ceci dit "supprime toutes les lignes de la sortie en commençant par la ligne correspondante et en continuant jusqu'à la fin du fichier".

mais le premier est plus rapide. Cependant, le traitement cessera complètement. Par conséquent, si vous avez plusieurs fichiers comme arguments, ceux qui suivent le premier fichier correspondant ne seront pas traités. Dans ce cas, le formulaire de suppression est préférable.

Si vous souhaitez imprimer la ligne correspondante, mais pas les lignes suivantes:

sed '/The second line/q' inputfile

Ceci dit "affiche toutes les lignes et quitte lorsque la ligne correspondante est atteinte" (l'option -n (Aucune impression implicite) n'est pas utilisée).

Voir man sed pour plus d'informations.

109

C'est un peu plus court que d'autres solutions données. Quitter avec majuscule Q évite d’imprimer la ligne en cours.

 sed '/The second line/Q' file

Pour supprimer réellement les lignes, vous pouvez utiliser la même syntaxe.

 sed -i '/The second line/Q' file
22
jaap
sed '/The second line/q0' file

Ou, sans gnou sed:

sed '/The second line/q' file

Ou, en utilisant grep:

grep -B 9999999 "The second line"
5
Erik

Utiliser awk (ne pas montrer la ligne correspondante)

awk '/pattern/ {exit} {print}' file.txt
4
Joel Arnold

Ajoutez d'abord le numéro de ligne et supprimez la ligne

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

en utilisant awk

awk 'NR!=3 && NR!=4' new.txt 
The first line
The second line
0
sush
awk '/The second line/{exit}1' file
0
kurumi