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.
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 shells/old/new/
remplace old
par new
s/\n//
supprime la nouvelle ligne entre les deux lignesp
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)
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