[英]Match two lines, replace with three lines
我需要使用sed
將每個匹配的兩線模式替換為三線模式。 這是我的輸入文件( tempfile.txt
)。
lease 192.168.6.100 {
binding state free;
hardware ethernet 00:e0:4c:68:00:96;
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
lease 192.168.6.100 {
binding state free;
hardware ethernet 00:e0:4c:68:00:96;
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
基本上,如果client-hostname "HOSTNAME";
缺少,則應先使用tab
,然后再使用newline
替換它。
我的嘗試: sed 'N; /hardware.*}/d; P; D' tempfile.txt
sed 'N; /hardware.*}/d; P; D' tempfile.txt
結果是:
lease 192.168.6.100 {
binding state free;
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
lease 192.168.6.100 {
binding state free;
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
這是我想要的輸出。
lease 192.168.6.100 {
binding state free;
hardware ethernet 00:e0:4c:68:00:96;
<tab>
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
lease 192.168.6.100 {
binding state free;
hardware ethernet 00:e0:4c:68:00:96;
<tab>
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
正如您所看到的,在小卷發之間始終有三條線。 這就是我的目標。
這可以解決問題(將管道打到cat -A
以顯示不可打印的字符):
$ sed -r 'N;s/^([[:space:]]*hardware.*)(\n})$/\1\n\t\2/;t;P;D' infile | cat -A
lease 192.168.6.100 {$
binding state free;$
hardware ethernet 00:e0:4c:68:00:96;$
^I$
}$
lease 192.168.6.100 {$
binding state active;$
hardware ethernet 00:e0:4c:68:00:96;$
client-hostname "andrew-H81M-S2PH";$
}$
lease 192.168.6.100 {$
binding state free;$
hardware ethernet 00:e0:4c:68:00:96;$
^I$
}$
lease 192.168.6.100 {$
binding state active;$
hardware ethernet 00:e0:4c:68:00:96;$
client-hostname "andrew-H81M-S2PH";$
}$
而不是刪除匹配項,而是捕獲應該包圍空行的兩行,並用換行符和之間的制表符代替。 我還添加了一些錨點以實現更安全的匹配。
涉及一些技巧,因為模式空間在替換后包含兩個換行符,但是P;D
僅打印第一行並開始一個新循環,這也會在包含client-hostname
行之后導致不需要的換行符。
詳細解釋:
N # Append next line to pattern space
# If the hostname is missing, insert a newline and a tab
s/^([[:space:]]*hardware.*)(\n})$/\1\n\t\2/
t # If we did the substitution, jump to end (prints complete pattern space)
P # Print first line in pattern space
D # Delete first line in pattern space - starts new cycle
我冒昧地增加了另一個卷曲...
sed 'N; s/hardware.*}/\t\n}/; P; D' andy
lease 192.168.6.100 {
binding state free;
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
lease 192.168.6.100 {
binding state free;
}
lease 192.168.6.100 {
binding state active;
hardware ethernet 00:e0:4c:68:00:96;
client-hostname "andrew-H81M-S2PH";
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.