Comment supprimer toutes les lignes d’un fichier en partant de la 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 après celle-ci dans le fichier, afin de supprimer 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, sinon comment devrais-je le faire?

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

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

Cela dit “lorsque vous atteignez la ligne qui correspond au modèle quitter, sinon, imprimez chaque ligne”. L’option -n empêche l’impression implicite et la commande p est requirejse pour imprimer explicitement des lignes.

ou

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

Cela dit “supprimer toutes les lignes de la sortie en commençant à la ligne correspondante et en continuant jusqu’à la fin du fichier”.

mais le premier est plus rapide. Cependant, il cessera complètement le traitement, donc 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 

Cela dit “Imprimer toutes les lignes et quitter lorsque la ligne correspondante est atteinte” (l’option -n (pas d’impression implicite) n’est pas utilisée).

Voir man sed pour des informations supplémentaires.

C’est un peu plus court que les autres solutions. Quitter l’utilisation du capital 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 
 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" 

Utiliser awk (ne pas afficher la ligne correspondante)

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

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 
 awk '/The second line/{exit}1' file