wake-up-neo.net

Wie hängt man einen String am Ende einer bestimmten Zeile in einer Datei in Bash an?

Ich möchte einen Alias ​​an das Ende einer bestimmten Zeile meiner hosts-Datei anhängen. Zum Beispiel

Ich habe

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

Ich möchte es so aussehen

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

Ich möchte die Zeile finden, die 19.2.68.1.2 enthält, und am Ende Myalias anhängen. Die Zeile ist nicht notwendigerweise die zweite Zeile in der Datei, wie ich sie hier gezeigt habe. Es könnte überall sein.

13
Chris F

Verwenden Sie sed und das beschriebene Muster:

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

Verwenden Sie sed und eine bestimmte Zeilennummer:

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

Eine awk-Lösung ist ebenfalls möglich:

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

Oben werden Zeilen aus der hosts-Datei nacheinander gelesen. Wenn die Zeile am Anfang unsere IP-Adresse hat, wird myalias an die Zeile angehängt. Die Zeile wird dann in stdout gedruckt.

Beachten Sie zwei Dinge. Es gibt ein Leerzeichen hinter der IP-Adresse in der if-Bedingung. Andernfalls könnte der Regex mit 192.168.1.20 usw. übereinstimmen. Außerdem werden die Zeiträume in der IP-Adresse mit Backslashes gekennzeichnet. Ansonsten könnten sie mit jedem Zeichen übereinstimmen.

Eine Pithierform der Lösung ist:

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

Ich würde mit awk gehen, da Sie Strings verwenden können und keine regulären Ausdrücke verwenden müssen, bei denen Punkte mit Escapezeichen versehen werden müssen und Anker und/oder Word-Grenzen verwendet werden müssen. Sie können auch sicherstellen, dass die Zeichenfolge mit einem Wert in Spalte 1 übereinstimmt.

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

Auch wenn es Teil eines größeren Skripts ist, ist es schön, variable Zeichenfolgen verwenden zu können. Mit sed benötigen Sie Shell-Variablen und zitieren Tricks.

0
Scrutinizer

Hier ist eine andere Möglichkeit, awk zu verwenden.

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