2013-04-25 28 views
5

Tôi muốn thêm dòng mới sau chuỗi trùng khớp + 2 dòng.'sed': Cách thêm dòng mới sau chuỗi kết hợp + 2 dòng

Dưới đây là tập tin của tôi:

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 

Tôi muốn thêm 'cửa ngõ 192.168.1.1' sau khi tìm thấy 'iface eth1' + 2 dây chuyền.

dụ: những gì tôi cần phải nhận được sau khi thực hiện lệnh 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 

Tôi biết làm thế nào để tìm và di chuyển 2 dòng sau đó, thêm dòng sau chuỗi cụ thể, vv nhưng không kết hợp hoạt động này 2. Steph

Trả lời

0

nếu bạn muốn thêm dòng vào cuối khối đó, hãy thử này:

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

với tập tin của bạn:

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

Điều này dường như làm việc:

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

Thêm tùy chọn -i vào sed để lưu kết quả trở lại đến input.txt.

+0

Cảm ơn rất nhiều! điều này thực sự hữu ích. – user2319609

+0

@ user2319609 Rất vui khi được trợ giúp. Bạn có thể [chấp nhận câu trả lời] (http://meta.stackexchange.com/a/5235/181223), nhân tiện. –

+0

Câu trả lời tuyệt vời. Sẽ được sử dụng thường xuyên, như tôi đã từng làm một cái gì đó như 'line_num2 = $ (grep -n 'txt_to_find' targ_file.h | awk '{print $ 1}')' và sau đó thêm để có được số dòng tôi cần! Điều này hiệu quả hơn nhiều. – Zmart

2

Một cách sử dụng sed:

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

Bạn đã yêu cầu sử dụng 'sed' nhưng 'Kent' được sử dụng 'awk', đây là một kịch bản sed mà những gì bạn muốn ví dụ của bạn. Nói chung, dòng 1 của tập lệnh sed có thể chứa bất kỳ chuỗi nào bạn muốn và dòng 5 của tập lệnh sed có thể chứa bất kỳ chuỗi ký tự nào bạn muốn. Đặt tập lệnh sau vào tệp, giả sử x.sed, không thêm bất kỳ dấu cách hoặc tab nào.

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

Sau đó, chạy như thế này trên dòng lệnh.

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

Cảm ơn, tôi đã cố gắng làm tương tự, như thế này ... sed -i.bak '/^iface eth1/{n; n; a \ gateway 192.168.1.1}'/etc/network/interfaces – user2319609

+0

... mà không cần sự thành công !!?? Tôi không biết tại sao? – user2319609

Các vấn đề liên quan