Comment supprimer des lignes spécifiques d'un fichier à l'aide de sed

À certaines occasions, nous devons supprimer une ligne spécifique d'un fichier ou de plusieurs, par exemple, il m'est arrivé que j'ai eu toute une liste de fichiers et j'ai besoin de supprimer la ligne # 27 de tous ceux-ci (la ligne # 27 est que d'une ACL, d'une norme, d'une règle, d'une configuration), je peux soit éditer fichier par fichier, soit simplement réaliser ce dont j'ai besoin en utilisant la commande sed et un script bash (facultatif).

Mais essayons un seul fichier un peu simple.

Nous avons le dossier distributions-deb.txt qui contient ceci:

debian

Kubuntu

archlinux

solus

menthe

Autrement dit, le fichier distributions-deb.txt est dans laquelle nous allons mettre les distributions basées sur Debian, mais là nous voyons qu'à la ligne # 3 se trouve «archlinux», une distribution qui n'a évidemment rien à voir avec Debian, donc nous devons éliminer cette ligne. Pour éliminer la ligne n ° 3 de ce fichier, nous mettrons ce qui suit:

sed "3d" distros-deb.txt > distros-deb-ok.txt

Expliquer cette ligne est un peu facile, avec soif "3d" nous indiquons que nous supprimerons la ligne n ° 3, avec distributions-deb.txt Nous indiquons sur quel fichier travailler, c'est-à-dire supprimons la ligne n ° 3 de ce fichier, jusqu'ici si nous appuyons sur Entrée, cela nous montrera ce que nous voulons mais dans le terminal, donc avec > distributions-deb-ok.txt nous indiquons qu'au lieu d'afficher le résultat dans le terminal, de le mettre dans un fichier avec ce nom.

Qu'est-ce qui est simple?

De plus, nous pouvons éviter d'utiliser le > distributions-deb-ok.txt en utilisant un paramètre approprié de sed, le paramètre -i

Autrement dit, si nous voulons supprimer la ligne du fichier et l'enregistrer avec le même nom (et pas dans un autre fichier), ajoutez simplement le paramètre -i :

sed -i "3d" distros-deb.txt

Cela supprimera la ligne n ° 3 de distros-deb.txt et l'enregistrera.

Que faire si je veux une plage de lignes, c'est-à-dire supprimer la ligne # 3 mais aussi # 4 et # 5? Pour y parvenir, nous mettons la plage de 3 à 5, soit:

sed -i "3,5d" distros-deb.txt

Et il ne me montrera que debian et kubuntu 😀

Alors que faire si je veux supprimer de la ligne 2 à la dernière, alors que je ne connais pas le nombre total de lignes?

Utilisez simplement le symbole du dollar - »$

sed -i "2,$d" distros-deb.txt

Si vous souhaitez éliminer de la première ligne au n ° 4, nous mettons simplement la valeur 1 au début:

sed -i "1,4d" distros-deb.txt

Cela a été tout, une astuce très utile lorsque vous voulez faire des scripts bash pour automatiser des tâches et que vous devez modifier et éliminer des lignes de fichiers de configuration, pour modifier nous pouvons utiliser sed o perl, ainsi que pour éliminer, nous savons déjà comment le faire avec sed 😉

salutations


Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont marqués avec *

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.

  1.   mss-développement dit

    Très bonne contribution 😉

    1.    KZKG ^ Gaara dit

      Merci

      Au fait, nous avons reçu votre email en ce moment je vous répondrai 😀

      salutations

  2.   sans nom dit

    En tant que grand prêtre du terminal, des serveurs et des connexions ssh je viens à vous, oh super KZKG ^ Gaara, et je vous demande: où puis-je obtenir un tutoriel au niveau de mon ignorance qui me permet d'utiliser des connexions ssh entre deux machines distantes dans différents réseaux pour partager des fichiers texte, pdf, image et son (mp3)….

    ????

    Sérieusement, pourriez-vous me guider à cet égard, j'ai deux machines, une au travail et une à la maison et j'ai besoin d'une connexion ssh entre elles (car si je comprends bien, ssh permet de partager du contenu entre les machines, est-ce que je me trompe? ).
    Et si je me trompe, quelle application recommandez-vous?
    Et où puis-je trouver un didacticiel de base à cet égard?

    1.    -espion- dit

      scps

      scp user @ machine_address: chemin user @ machine_address: chemin.

      Même syntaxe que cp, source -> destination.

  3.   f3niX dit

    Vous vous êtes présenté mec, vous étiez perdu.

  4.   Joaquin dit

    Bon conseil!

  5.   LycusHackerEmo dit

    Conseil intéressant… xD

    par hasard, vous n'en connaissez pas un qui fasse ressortir le texte en gras?
    Je veux dire, j'ai un fichier txt qui est un dictionnaire, il a plus de 10000 XNUMX lignes et je veux qu'il surligne certains textes avant les points de suspension ":" et le faire un par un est trop.

    1.    KZKG ^ Gaara dit

      Salut,

      Un fichier txt est du texte brut, comme son nom l'indique ... simple, sans format ou quelque chose de similaire, je suis désolé mais je pense que ce que vous demandez ne peut pas être fait, n'est-ce pas? 🙁

      salutations

      1.    aca dit

        en fait, c'est possible, mais vous devez connaître le format de destination.
        par exemple:
        echo $ (echo "Robert: Bonjour. Changer ici" | sed 's / \ ./. \\ e [40; 31m /; s / \: /: \\ e [40; 35m /')
        il s'agit de s'en sortir.
        L'autre moyen de supprimer qui peut être utilisé est sed '/' $ 1 '/ d' mais vous devez être sûr du re.

        1.    LycusHackerEmo dit

          puis finissez de l'enregistrer dans * .odt

          N'y a-t-il pas un moyen plus simple de le faire avec LibreOffice?

  6.   Lolo dit

    Pourriez-vous supprimer une partie d'une ligne et laisser le reste?

    Disons que je veux tout supprimer devant un mot dans une certaine ligne.

    Ou supprimez tout ce qui suit ce mot.

    1.    aca dit

      Oui, il s'agit de tirer une regex (si nécessaire man sed -r, –regexp-extended)
      À partir de ce que je trouve
      echo «Robert: Bonjour. Changer ici »| sed 's / Change //'
      avec un motif bien défini et avec. (un caractère) et * (plus d'un)
      Après:
      echo «Robert: Bonjour. Changer ici »| sed 's / Change. * //'
      Avant:
      echo «Robert: Bonjour. Changer ici »| sed 's /. * Changer //'
      S'il est important que le mot apparaisse
      echo «Robert: Bonjour. Changer ici »| sed 's / Change. * / Change /'
      ou plus élaboré
      dans la ligne contenant Robert ce qui se passe après le changement
      echo -e «Fritz: Bonjour. Changez ici \ nRobert: Bonjour. Changer ici »| sed '/Robert/s/Cambio.*//'
      ou comme au début sortez la deuxième ligne et traitez le reste
      echo -e «Fritz: Bonjour. Changez ici \ nRobert: Bonjour. Changer ici \ nAutre »| sed -e 2d -e 's / Change. * //'
      echo -e «Fritz: Bonjour. Changez ici \ nRobert: Bonjour. Changer ici \ nAutre »| sed '2d; s / Change. * //'

      1.    Lolo dit

        Merci, c'est très utile pour moi.

  7.   msx dit

    Bel article, l'un de ceux que j'aime, comme le SysAdmin!
    Que serait notre vie sans sed, awek, perl, grep, tail, head, "Emacs" et tant d'autres outils essentiels!?

  8.   Lisbeth Ollarves dit

    Merci, c'était très utile.

  9.   Épingles dit

    Bonjour, et comment pouvez-vous supprimer les lignes 1,4, 10 et XNUMX d'un fichier dans la même commande?