我需要编辑如下文件:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
目标是删除以 'iface...inet6' 开头的行,并删除接下来以空格开头的几行(可以没有或多个):
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
并保持其余部分不变以获得以下结果:
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
我尝试使用 sed,如下所示:
sed -i.old -r -e "/iface\s*\w*\s*inet6.*/,\${d;/^\s.*/d;}" /etc/configfile
但它会删除从正确位置开始但擦除到末尾的所有内容。我只想删除选择 iface 文本后以空格开头的行。
答案1
尝试对您的sed
单衬进行以下调整:
sed '/iface\s*\w*\s*inet6.*/,/^[^ ]/ {/^[^ i]/!d}' file
它匹配从第一个模式到不以空格字符开头的第一行的范围,并删除以空格或“i”(用于前导iface
)开头的行。需要重新考虑i
块之后是否需要。
看起来这样有效:
sed -n '/iface\s*\w*\s*inet6.*/ {:L; n; /^[ ]/bL;}; p' file
请尝试并报告回来。
答案2
标准脚本sed
使用显式循环来删除行:
/^iface .* inet6/ {
:again
N
s/.*\n//
/^[[:blank:]]/b again
}
该脚本找到这些inet6
行,然后将下一行附加到模式空间内部的该行(中间嵌入换行符)。然后,它删除直到并包括第一个换行符的模式空间(这将删除原始inet6
行)。它会继续执行此操作,直到模式空间不以空白字符(空格或制表符)开头。
测试:
$ cat file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
iface wlx000 inet6 auto
post-up sysctl -w net.ipv6.conf.wlx000.accept_ra=2
auto wlx000
$ sed -f script.sed <file
auto wlx00
allow-hotplug wlx00
iface wlx000 inet dhcp
auto wlx000
人工数据测试:
$ cat file
something1
something2
iface have a inet6 here
delete me
me too
same here
something3
something4
iface more something inet6
be gone
skip this
something5
$ sed -f script.sed <file
something1
something2
something3
something4
something5
该脚本为“一行”:
sed -e '/^iface .* inet6/ {' -e ':a' -e 'N;s/.*\n//;/^[[:blank:]]/ba' -e '}'
答案3
您已经获得了关于sed
工具的良好答案,但让我提出其他我认为更简单的方法,使用pcregrep
:
pcregrep -Mv '^iface.*inet6(.|\n )*' file
正则表达式应该是不言自明的 - 我们从该行开始搜索模式^iface.*inet6
,然后搜索任何字符组或新行,后跟重复零次或多次的单个空格。然后我们只需要指示pcregrep
允许与-M
选项进行多线性匹配并反转整个事情-v
(匹配的部分将被删除)。