web-dev-qa-db-fra.com

Copier un texte spécifique à partir d'un fichier de plusieurs lignes et le coller automatiquement dans un autre fichier à l'aide du terminal

ma question concerne le traitement de texte:

Dans une liste, j'ai les adresses IP et les noms d'ordinateur au format suivant:

IP address: 192.168.1.25
Computer name: computer7office
IP address: 192.168.1.69
Computer name: computer22office
IP address: 192.168.1.44
Computer name: computer12personal

La sortie dont j'ai besoin:

This computer ip address is xxx.xxx.x.xx and is under the name zzzzzzzzzz

Comment copier automatiquement les adresses IP et les noms de la liste dans le fichier de sortie à l'aide de la ligne de commande? Pourriez-vous s'il vous plaît expliquer votre commande parce que c'est dommage quand je dois copier/coller des choses que je ne comprends pas.

4

Dans sed, en supposant que votre liste se trouve dans un fichier nommé file, vous pouvez utiliser:

sed -n '/ss: /N;s/\n//;s/IP address:/This computer ip address is/;s/Computer name:/ and is under the name/p' file
  • -n n'imprime rien tant que nous ne le demandons pas
  • /ss: / trouve le motif ss: (pour faire correspondre les lignes avec IP address:)
  • N lit la ligne suivante aussi pour que nous puissions les rejoindre
  • ; sépare les commandes, comme dans le shell
  • s/old/new/ remplace old par new
  • s/\n// supprime la nouvelle ligne entre les deux lignes
  • p affiche les lignes sur lesquelles nous avons travaillé

Lorsque vous voyez ce que vous voulez, répétez la commande en ajoutant > newfile à la fin pour écrire le fichier modifié dans newfile.

Plus lisiblement:

sed -n '{
    /ss: /N
    s/\n//
    s/IP address:/This computer ip address is/
    s/Computer name:/ and is under the name/p
}' file | tee newfile

(tee écrit utilement sur le newfile et affiche la sortie en même temps)

6
Zanna

Il existe probablement une douzaine de façons de le faire, en utilisant divers utilitaires de traitement de texte (awk, Perl) et/ou des éditeurs de flux (sed, ed)

Une solution consisterait à cut la liste des délimiteurs de deux points (-d:), en ne conservant que le second champ (-f2), puis à utiliser xargs pour transmettre des paires de lignes. (-l2) comme arguments de printf:

$ cut -d: -f2 list.txt | xargs -l2 printf 'This computer ip address is %s and is under the name %s\n'
This computer ip address is 192.168.1.25 and is under the name computer7office
This computer ip address is 192.168.1.69 and is under the name computer22office
This computer ip address is 192.168.1.44 and is under the name computer12personal
6
steeldriver