Как добавить строку в конце определенной строки в файле в bash

Я хочу добавить псевдоним в конец определенной строки моего файла hosts. Например

У меня

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

Я хочу, чтобы это выглядело как

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

Я хочу найти строку, содержащую 19.2.68.1.2, и добавить myalias в конце. Строка не обязательно является второй строкой в ​​файле, как показано здесь. Это может быть где угодно.

Ответ 1

Использование sed и описанного шаблона:

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

Используя sed и номер конкретной строки:

sed '2s/$/ myalias/' file

Ответ 2

Возможно также решение awk:

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

Вышеприведенное число читает строки из файла hosts один за другим. Если строка имеет наш IP-адрес в начале, то myalias добавляется к строке. Затем строка печатается на stdout.

Обратите внимание на две вещи. В поле if есть пробел после IP-адреса. В противном случае регулярное выражение может соответствовать 192.168.1.20 и т.д. Кроме того, периоды в IP-адресе экранируются с помощью обратных косых черт. В противном случае они могут соответствовать любому символу.

Более крутой формой решения является:

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

Ответ 3

Вот еще один способ: awk

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

Ответ 4

Я бы пошел с awk, так как вы можете использовать строки и не использовать регулярное выражение, где нужно будет экранировать точки, а также использовать привязки и/или границы слов. Также вы можете убедиться, что строка соответствует значению в столбце 1.

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

Также, когда он является частью более крупного script, неплохо иметь возможность использовать переменные строки. С помощью sed вам понадобятся переменные оболочки и трюки.