2013-04-25 2 views
5

Я бы хотел добавить новую строку после строки + 2 строки.'sed': Как добавить новую строку после совпадения строк + 2 строки

Вот мой файл:

allow-hotplug eth0 
auto eth0 
iface eth0 inet static 
address 172.16.2.245 
netmask 255.255.254.0 
gateway 192.168.1.1 

allow-hotplug eth1 
#auto eth1 
iface eth1 inet static 
address 192.168.0.240 
netmask 255.255.255.0 

iface eth2 inet static 
address 192.168.2.240 
netmask 255.255.255.0 

Я хочу добавить 'шлюз 192.168.1.1' после того, как нашел 'Iface eth1' + 2 строки.

пример: то, что мне нужно получить после выполнения SED команды

allow-hotplug eth0 
auto eth0 
iface eth0 inet static 
address 172.16.2.245 
netmask 255.255.254.0 
gateway 172.16.2.254 

allow-hotplug eth1 
#auto eth1 
iface eth1 inet static 
address 192.168.0.240 
netmask 255.255.255.0 
gateway 192.168.1.1 

iface eth2 inet static 
address 192.168.2.240 
netmask 255.255.255.0 

Я знаю, как найти и переместить 2 линии после добавления строки после определенной строки, и т.д., но не совместить эту операцию 2. Стеф

ответ

0

, если вы хотите добавить строку в конец этого блока, попробуйте следующее:

awk -v RS="" -v ORS="\n\n" '/iface eth1/{$0=$0"\ngateway 192.168.1.1"}1' file 

с файлом:

kent$ cat file 
allow-hotplug eth0 
auto eth0 
iface eth0 inet static 
address 172.16.2.245 
netmask 255.255.254.0 
gateway 192.168.1.1 

allow-hotplug eth1 
#auto eth1 
iface eth1 inet static 
address 192.168.0.240 
netmask 255.255.255.0 

iface eth2 inet static 
address 192.168.2.240 
netmask 255.255.255.0 

kent$ awk -v RS="" -v ORS="\n\n" '/iface eth1/{$0=$0"\ngateway 192.168.1.1"}1' file 
allow-hotplug eth0 
auto eth0 
iface eth0 inet static 
address 172.16.2.245 
netmask 255.255.254.0 
gateway 192.168.1.1 

allow-hotplug eth1 
#auto eth1 
iface eth1 inet static 
address 192.168.0.240 
netmask 255.255.255.0 
gateway 192.168.1.1 

iface eth2 inet static 
address 192.168.2.240 
netmask 255.255.255.0 
6

Это похоже на работу:

sed '/^iface eth1/{N;N;s/$/\ngateway 192.168.1.1/}' input.txt 

Добавить -i на sed, чтобы сохранить результат до input.txt.

+0

Большое спасибо! это действительно полезно. – user2319609

+0

@ user2319609 Рад помочь. Вы можете [принять ответ] (http://meta.stackexchange.com/a/5235/181223), кстати. –

+0

Фантастический ответ. Будет использовать это часто, поскольку я использовал что-то вроде 'line_num2 = $ (grep -n 'txt_to_find' targ_file.h | awk '{print $ 1}')', а затем добавить, чтобы получить нужный номер строки! Это намного эффективнее. – Zmart

2

Один из способов использования sed:

sed ' 
/iface eth1/ { 
n 
n 
a\gateway 192.168.1.1 
}' file 
0

Вы просили использовать «СЭД», но «Кент» использует «AWK», вот СЭД скрипт, который делает то, что вы хотите для вашего примера. Чтобы быть более общим, строка 1 сценария sed может содержать любую строку, которую вы хотите, а строка 5 сценария sed может содержать любую нужную строку. Поместите следующий скрипт в файл, скажем, x.sed, не добавляйте пробелы или вкладки.

/iface eth1/{ 
    n 
    n 
    a\ 
    gateway 192.168.1.1 
    } 

Затем запустите его так же, как в командной строке.

sed -f x.sed "myinputfile" > "myoutputfile" 
+0

Спасибо, я попытался сделать то же самое, например ... sed -i.bak '/^iface eth1/{n; n; a \ gateway 192.168.1.1}'/etc/network/interfaces – user2319609

+0

... без успех !! ?? Я не знаю почему? – user2319609

Смежные вопросы