web-dev-qa-db-fra.com

Comment supprimer des lignes spécifiques d'un fichier txt

J'ai un script Bash qui écrit les données dans un fichier journal, puis je retire les données que je souhaite à l'aide de la commande sed. Cela me donne un fichier data.txt. Ce que je veux savoir, c'est comment je vais supprimer une ligne spécifique à l'intérieur de ce fichier data.txt.

Par exemple:

123
456
789

Je veux supprimer la 2ème ligne, contenant 456 afin que je n'ai que

123

789

J'ai essayé avec sed '2d' data.txt mais cela ne fonctionne pas.

J'utilise cette commande pour créer data.txt à partir de log.log:

sed -nE '1s/.{1}(.{2}).*/\1/p;' log.log >> data.txt
4
Insanebench420

Essaye ça. Cela devrait marcher.

sed -i '2d' data.txt

Vous devez ajouter -i flag avec la commande sed à moins que vous ne redirigiez votre sortie vers un nouveau fichier. Si vous n'ajoutez pas l'indicateur -i, sed imprimera l'espace de modèle sur STDOUT et n'apportera aucune modification au fichier d'origine.

option de sauvegarde automatique

Il est très dangereux de modifier un fichier sans effectuer une sauvegarde appropriée. Ainsi, sed a sa méthode native pour sauvegarder un fichier avant édition qui est l'option -i.bak.

Ainsi, dans l'exemple ci-dessus, si nous utilisons l'option de sauvegarde, la commande serait.

sed -i.bak '2d' data.txt

Ainsi, il supprimera la première ligne du fichier data.txt et fera également une copie de sauvegarde du fichier d'origine avec l'extension .bak.

7
ran

Vous savez, en plus de spécifier par numéro de ligne, vous pouvez également le faire en faisant correspondre le contenu de la ligne, si cela est plus utile (ce qui semble être le cas):

sed -i '/^456$/d' data.txt
6
JoL

Utilisation de awk:

awk 'NR!=2{ print }' input-file > output-file

Cela pourrait se lire comme suit: si le nombre d’enregistrements n’est pas égal à 2, imprimez l’enregistrement (ligne). Si vous souhaitez supprimer la deuxième et la troisième ligne:

awk 'NR!=2 && NR!=3 { print }' input-file

Si vous voulez avoir une ligne vide telle qu'elle apparaît dans la question, la commande sed devrait ressembler à ceci:

 sed '2 s/^.*$//' input-file

Le premier caractère 2 est le numéro de la ligne, suivi de la commande s, qui remplacera tous les caractères .* du début ^ à la fin $ de la ligne par une chaîne vide //. Dans ce cas, les caractères de début et de fin peuvent être omis.

Exemple:

$ cat input-file
123
456
789
654

$ sed '2,3 s/.*//' input-file
123


654
3
pa4080

Cette commande supprimera les lignes 2 à 4 et 6

sed -e '2,4d;6d' file
2
Petr