Tant qu'il n'y a pas outrageusement de lignes à supprimer et vous ne travaillez pas sur un système avec une version limitée de sed
lamentablement (à un moment donné, sed
sur HP-UX a été limitée à environ 100 commandes), vous pouvez utiliser:
sed 's/$/d/' linenum.txt | sed -f - file.txt
Il utilise le premier sed
pour convertir les numéros de ligne dans les commandes de suppression (notez qu'une partie de votre problème était une barre oblique indésirable parasite) et dit alors à lire la deuxième sed
son script à partir de l'entrée standard (-f -
) et l'appliquer à file.txt
.
Ce qui précède fonctionne avec GNU sed
; il n'a pas fonctionné avec BSD sed
sur Mac OS X 10.7.5 (sed: -: No such file or directory
). Testez-le avant de l'utiliser sur votre système.
Bien sûr, si vous avez une version suffisamment récente de bash
(fonctionne avec bash
4.2 mais pas avec 3.2), vous pouvez utiliser la « substitution de processus » pour contourner la limitation de sed
:
sed -f <(sed 's/$/d/' linenum.txt) file.txt
Si cela ne fonctionne pas non plus, vous pouvez écrire la sortie de la première commande sed
à un fichier, puis utiliser ce fichier (temporaire) comme nom pour le script sed
. Donc, il y a beaucoup de façons de le faire. Cependant, n'importe quoi sur 3 processus (deux exécutions de sed
et un de rm
) est extravagant. Ce n'est probablement pas un problème si vous n'avez besoin de le faire qu'une seule fois, mais cela peut poser problème si vous devez le faire plusieurs fois par minute.
donc vous avez un deuxième fichier qui répertorie les lignes qui doivent être supprimées du premier fichier? –
Merci. Le script fonctionne mais il ne supprime pas les lignes. Est-ce que j'utilise la commande sed mal? – MFK
@ sampson-chen oui – MFK