使用sed,是否有一种方法可以根据某些起始表达式和结束表达式从文本文件中删除多行?
我知道文件中的标记,希望删除(包括标记)之间的所有内容。我已经看到了一些非常复杂的解决方案,我想做到这一点,而不求助于微命令。
我的文件看起来是这样的:
cat /tmp/foobar.txt
this is line 1
this is line 3
tomcat.util.scan.StandardJarScanFilter.jarsToSkip=\
annotations-api.jar,\
ant-junit*.jar,\
ant-launcher.jar,\
ant.jar,\
asm-*.jar,\
aspectj*.jar,\
bootstrap.jar,\
catalina-ant.jar,\
catalina-ha.jar,\
catalina-ssi.jar,\
catalina-storeconfig.jar
the end leave me
and me我想删除从tomcat.util开始的所有东西,直到最后一个.jar
发布于 2021-09-26 05:54:29
tldr;
我认为这是最简单的方式,而不需要像微命令那样进行组装。
sed '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt产
this is line 1
this is line 3
the end leave me
and me如果希望删除文件中的行,而不是将输出吐出到stdout,则使用inline标志,因此
sed -i '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt所以..。这是怎么回事?
sed命令,就像vi命令在address上运行一样。通常,我们不指定地址,而这只是将命令应用于文件的所有行,例如在文件中将the替换为that时
sed -i 's/the/that/g' /tmp/foobar.txt将替换或s命令应用于文件中的所有行。
在本例中,您希望删除某些行,以便我们可以使用delete或d命令。但我们得告诉它应该在哪里删除。所以我们需要给它一个地址。
sed命令的格式是
[addr][!]command[options](见医生们 )
如果没有指定地址,则命令将应用于所有行,如果指定了!,则将其应用于与模式不匹配的所有行。到目前一切尚好。
这里的诀窍是,addr可以是单个地址,也可以是一系列地址。地址可以是行号或正则表达式。您可以在两个地址之间使用,来指定范围。
因此,要删除第5行至第8行(包括在内),您可以这样做
sed -i '5,8d' /tmp/foobar.txt在这种情况下,我们不知道行号,我们知道一些“标记”,我们可以使用Regex,因此第一个标记,以tomcat.util开头的行是由正则表达式找到的。
/^tomcat\.util.*$/第二个标记有点棘手,但如果我们看一下,我们可以看到要删除的最后一行是第一个不以\结尾的行,因此我们可以匹配由“任意但不以\结尾”组成的行。
/^.*[^\]$/虽然第二个标记可以匹配整串行,如果我们从这两个正则表达式中生成一个范围,则范围意味着第二个“地址”是与正则表达式匹配的第一个地址之后的第一行。
综上所述,我们希望删除(d)范围内的所有行,从regex找到的地址到匹配以tomcat.util开头的行和不以\ ie结尾的行的地址。
sed '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt希望这会有所帮助;-)
干杯
卡尔
发布于 2021-09-26 21:27:40
这可能对您有用(GNU sed):
sed -n '/tomcat\.util/{:a;n;/\.jar/ba};p' file使用-n选项关闭隐式打印。
在包含tomcat.util的行上匹配。
继续获取行,直到该行与包含.jar的行不匹配为止。
打印所有其他行。
备选方案:
sed -E '/tomcat\.util/{:a;$!N;/\.jar(,\\)?$/s/\n//;ta;D}' file收集从tomcat.util开始并以.jar,\或.jar结尾的行,删除新行直到文件末尾或错误匹配,然后删除集合。
发布于 2021-09-27 13:30:29
对于任何跨越行的事物,Awk通常比sed更有用。在每个Unix框上使用任何shell中的任何awk:
$ awk '!/\.jar/{f=0} /tomcat\.util/{f=1} !f' file
this is line 1
this is line 3
the end leave me
and mehttps://stackoverflow.com/questions/69331939
复制相似问题