web-dev-qa-db-fra.com

Comment ajouter une chaîne à la fin d'une ligne spécifique dans un fichier en bash

Je veux ajouter un alias à la fin d'une certaine ligne de mon fichier hosts. Par exemple

J'ai

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com
192.168.1.3    www.address3.com

Je veux que ça ressemble

192.168.1.1    www.address1.com
192.168.1.2    www.address2.com myalias
192.168.1.3    www.address3.com

Je veux trouver la ligne qui contient 19.2.68.1.2 et ajouter myalias à la fin. La ligne ne correspond pas nécessairement à la deuxième ligne du fichier, comme je l’ai montré ici. Cela pourrait être n'importe où.

13
Chris F

En utilisant sed et le motif décrit:

sed '/192.168.1.2/s/$/ myalias/' file

Utiliser sed et un numéro de ligne spécifique:

sed '2s/$/ myalias/' file
33
Steve

Une solution awk est également possible:

awk '{if (/^192\.168\.1\.2 /) {$0=$0 " myalias"}; print}' hosts

Ce qui précède lit les lignes du fichier hosts une par une. Si la ligne a notre adresse IP au début, alors myalias est ajouté à la ligne. La ligne est ensuite imprimée à stdout.

Notez deux choses. Il y a un espace après l'adresse IP dans la condition if. Sinon, l'expression régulière pourrait correspondre à 192.168.1.20, etc. De plus, les points de l'adresse IP sont protégés par des barres obliques inverses. Sinon, ils pourraient correspondre à n'importe quel caractère.

Une forme plus concise de la solution est:

awk '/^192\.168\.1\.2 /{$0=$0 " myalias"}1' hosts
1
John1024

Je choisirais awk, car vous pouvez utiliser des chaînes sans devoir utiliser de regex, où il faudrait échapper des points et utiliser des ancres et/ou des limites de Word. Vous pouvez également vous assurer que la chaîne correspond à une valeur de la colonne 1.

awk '$1==s{$0=$0 OFS alias}1' s=192.168.1.2 alias=myalias file

De plus, lorsqu'il fait partie d'un script plus volumineux, il est agréable de pouvoir utiliser des chaînes de variables. Avec sed, vous auriez besoin de variables shell et de ruse de devis.

0
Scrutinizer

Voici un autre moyen d'utiliser awk

awk '/search pattern/{print $0 " myalias"; next}1'  file
0
jaypal singh