删除文本文件的一部分并使用sed跟随以下行


8

我需要编辑如下文件:

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
@fcm,请告诉我们以下解决方案是否正确。如果没有的话,我们可以为您调整


1
@TNT不是同一个问题。这不是要删除单行,而是删除一行以及后面带有空格的几行。
fcm

2
从理论上讲是重复的,但实际上却不是-我认为最好在这里提供一个单独的答案,以说明如何从给定的模式到具有前导空白的后续行进行匹配。
杰夫·谢勒

1
@rudic提供了一个出色且精心设计的答案,这远非简单的搜索和删除操作,建议的dup上就没有任何答案。
fcm

Answers:


7

尝试对您的sed一支班轮进行以下改装:

sed  '/iface\s*\w*\s*inet6.*/,/^[^ ]/ {/^[^ i]/!d}' file

它匹配从您的第一个模式到第一行(不以空格char开头)的范围,并删除以空格或“ i”开头的行(对于前导iface)。需要重新考虑是否应该i在块之后被要求。

看起来像这样:

sed -n '/iface\s*\w*\s*inet6.*/ {:L; n; /^[ ]/bL;}; p' file

请尝试并报告。


6

标准脚本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(匹配的部分将被删除)。


我通常更喜欢使用pcregrep,更加直观。
Rui F Ribeiro
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.