Ajouter du texte à la fin de chaque ligne


91

Je suis sur la ligne de commande Linux et j'ai un fichier avec

127.0.0.1
128.0.0.0
121.121.33.111

Je voudrais

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

Je me souviens que mes collègues utilisaient sed pour cela, mais après avoir lu le manuel de sed, je ne sais toujours pas comment le faire en ligne de commande?


2
Excellente question et j'adore la façon dont vous l'avez encadrée.
Anthony Rutledge

Réponses:


140

Vous pouvez essayer d'utiliser quelque chose comme:

sed -n 's/$/:80/' ips.txt > new-ips.txt

À condition que votre format de fichier soit exactement comme vous l'avez décrit dans votre question.

La s///commande de substitution fait correspondre ( trouve ) la fin de chaque ligne de votre fichier (en utilisant le $caractère), puis ajoute ( remplace ) le :80à la fin de chaque ligne. Le ips.txtfichier est votre fichier d'entrée ... et new-ips.txtvotre fichier nouvellement créé ( le résultat final de vos modifications. )


De plus, si vous avez une liste de numéros IP auxquels des numéros de port sont déjà attachés (comme noté par Vlad et comme indiqué par aragaer ), vous pouvez essayer d'utiliser quelque chose comme:

sed '/:[0-9]*$/ ! s/$/:80/' ips.txt > new-ips.txt

Ainsi, par exemple, si votre fichier d'entrée ressemblait à quelque chose comme ça (notez le :80) :

127.0.0.1
128.0.0.0:80
121.121.33.111

Le résultat final ressemblerait à ceci:

127.0.0.1:80
128.0.0.0:80
121.121.33.111:80

@Vlad Oui; mais selon les OP donnés en exemple d'entrée ... il ne devrait y avoir aucun numéro de port dans la liste des adresses IP. :) Même s'il y avait ... l'OP pourrait simplement lancer un autre sed à l' s///avance pour supprimer les numéros de port à la fin de chaque ligne.
Summea

1
Ok, juste clarifier ... Peut-être qu'il devrait y avoir une condition pour exclure les lignes où un port existe déjà.
Vlad

3
sed '/:[0-9]*$/ ! s/$/:80/'
aragaer

3
Ajoutez-le à votre propre réponse. La suggestion d'exclure les lignes avec des ports est déjà là dans les commentaires, je viens d'écrire la commande exacte.
aragaer

2
Si le fichier a des terminateurs CRLF, le :80sera ajouté au début de la ligne suivante. Utilisez d'abord dos2unixsur le fichier si nécessaire.
djnz0feh

14

Version concise de la commande sed :

sed -i s/$/:80/ file.txt

Explication:

  • sed s tream ed Itor
    • -i i n-place (modifier le fichier en place)
    • s scommande ubstitution
    • /replacement_from_reg_exp/replacement_to_text/ déclaration
    • $correspond à la fin de la ligne ( replacement_from_reg_exp )
    • :80texte que vous souhaitez ajouter à la fin de chaque ligne ( replacement_to_text )
  • file.txt le nom du fichier


12

Si vous souhaitez ajouter du texte à la fin de chaque ligne sur place (dans le même fichier), vous pouvez utiliser le -iparamètre, par exemple:

sed -i'.bak' 's/$/:80/' foo.txt

Cependant, l' -ioption est une extension Unix non standard et peut ne pas être disponible sur tous les systèmes d'exploitation.

Vous pouvez donc envisager d'utiliser ex(qui équivaut à vi -e/ vim -e):

ex +"%s/$/:80/g" -cwq foo.txt

qui ajoutera :80 à chaque ligne, mais parfois il peut l'ajouter à des lignes vides.

La meilleure méthode consiste donc à vérifier si la ligne contient réellement un nombre, puis à l'ajouter, par exemple:

ex  +"g/[0-9]/s/$/:80/g" -cwq foo.txt

Si le fichier a un format plus complexe, envisagez d'utiliser une expression régulière appropriée au lieu de [0-9].


0

À l'aide d'un éditeur de texte, recherchez ^M(contrôle-M ou retour chariot) à la fin de chaque ligne. Vous devrez d'abord les supprimer, puis ajouter le texte supplémentaire à la fin de la ligne.

sed -i 's|^M||g' ips.txt
sed -i 's|$|:80|g' ips.txt

0
  1. Vous pouvez également y parvenir en utilisant la technique de référence arrière

    sed -i.bak 's/\(.*\)/\1:80/' foo.txt
    
  2. Vous pouvez également utiliser avec awk comme celui-ci

    awk '{print $0":80"}' foo.txt > tmp && mv tmp foo.txt
    

-1

sed -i 's / $ /, / g' foo.txt

Je fais cela assez souvent pour ajouter une virgule à la fin d'une sortie afin que je puisse simplement la copier et la coller dans un tableau Python (ou votre langue préférée)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.