149 votes

Ajouter du texte à la fin de chaque ligne

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 veux

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 ?

196voto

summea Points 2792

Vous pourriez essayer d'utiliser quelque chose comme :

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

À condition que le format de votre fichier soit exactement celui que vous avez décrit dans votre question.

El s/// La commande de substitution correspond ( trouve ) à la fin de chaque ligne de votre fichier (à l'aide de la touche $ ) et ajoute ensuite ( remplace ) le :80 à la fin de chaque ligne. Le site ips.txt est votre fichier d'entrée... et new-ips.txt est votre fichier nouvellement créé ( le résultat final de vos modifications. )


De plus, si vous disposez d'une liste de numéros d'IP auxquels sont associés des numéros de port, (comme l'a fait remarquer l'équipe de la Vlad et comme donné par aragaer ), vous pourriez essayer d'utiliser quelque chose comme :

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

Donc, par exemple, si votre fichier d'entrée ressemble à quelque chose comme ceci (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

72voto

simhumileco Points 5383

Version concise du sed commandement :

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

Explication :

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

Comment y parvenir sans modifier le fichier d'origine ?

Si vous voulez laisser le fichier original inchangé et avoir les résultats dans un autre fichier, alors abandonnez -i et ajouter la redirection ( > ) vers un autre fichier :

sed s/$/:80/ file.txt > another_file.txt

21voto

sudhir Points 177
sed 's/.*/&:80/'  abcd.txt >abcde.txt

17voto

kenorb Points 2464

Si vous voulez ajouter du texte à la fin de chaque ligne en place (dans le même fichier), vous pouvez utiliser -i par exemple :

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

Cependant -i 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 (ce qui est équivalent à 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 effectivement 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 regex appropriée, au lieu de [0-9] .

4voto

k_vishwanath Points 507
  1. Vous pouvez également y parvenir en utilisant la technique de la rétro-référence.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X