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?
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.
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
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 montrer 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