首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed删除多行字符串的简单方法

使用sed删除多行字符串的简单方法
EN

Stack Overflow用户
提问于 2021-09-26 04:43:51
回答 3查看 1.3K关注 0票数 0

使用sed,是否有一种方法可以根据某些起始表达式和结束表达式从文本文件中删除多行?

我知道文件中的标记,希望删除(包括标记)之间的所有内容。我已经看到了一些非常复杂的解决方案,我想做到这一点,而不求助于微命令。

我的文件看起来是这样的:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-09-26 05:54:29

tldr;

我认为这是最简单的方式,而不需要像微命令那样进行组装。

代码语言:javascript
复制
sed '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt

代码语言:javascript
复制
this is line 1

this is line 3


the end leave me
and me

如果希望删除文件中的行,而不是将输出吐出到stdout,则使用inline标志,因此

代码语言:javascript
复制
sed -i '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt

所以..。这是怎么回事?

sed命令,就像vi命令在address上运行一样。通常,我们不指定地址,而这只是将命令应用于文件的所有行,例如在文件中将the替换为that

代码语言:javascript
复制
sed -i 's/the/that/g' /tmp/foobar.txt

将替换或s命令应用于文件中的所有行。

在本例中,您希望删除某些行,以便我们可以使用delete或d命令。但我们得告诉它应该在哪里删除。所以我们需要给它一个地址。

sed命令的格式是

代码语言:javascript
复制
[addr][!]command[options]

(见医生们 )

如果没有指定地址,则命令将应用于所有行,如果指定了!,则将其应用于与模式不匹配的所有行。到目前一切尚好。

这里的诀窍是,addr可以是单个地址,也可以是一系列地址。地址可以是行号或正则表达式。您可以在两个地址之间使用,来指定范围。

因此,要删除第5行至第8行(包括在内),您可以这样做

代码语言:javascript
复制
sed -i '5,8d' /tmp/foobar.txt

在这种情况下,我们不知道行号,我们知道一些“标记”,我们可以使用Regex,因此第一个标记,以tomcat.util开头的行是由正则表达式找到的。

代码语言:javascript
复制
/^tomcat\.util.*$/

第二个标记有点棘手,但如果我们看一下,我们可以看到要删除的最后一行是第一个不以\结尾的行,因此我们可以匹配由“任意但不以\结尾”组成的行。

代码语言:javascript
复制
/^.*[^\]$/

虽然第二个标记可以匹配整串行,如果我们从这两个正则表达式中生成一个范围,则范围意味着第二个“地址”是与正则表达式匹配的第一个地址之后的第一行。

综上所述,我们希望删除(d)范围内的所有行,从regex找到的地址到匹配以tomcat.util开头的行和不以\ ie结尾的行的地址。

代码语言:javascript
复制
sed '/^tomcat\.util.*$/,/^.*[^\]$/d' /tmp/foobar.txt

希望这会有所帮助;-)

干杯

卡尔

票数 1
EN

Stack Overflow用户

发布于 2021-09-26 21:27:40

这可能对您有用(GNU sed):

代码语言:javascript
复制
sed -n '/tomcat\.util/{:a;n;/\.jar/ba};p' file

使用-n选项关闭隐式打印。

在包含tomcat.util的行上匹配。

继续获取行,直到该行与包含.jar的行不匹配为止。

打印所有其他行。

备选方案:

代码语言:javascript
复制
sed -E '/tomcat\.util/{:a;$!N;/\.jar(,\\)?$/s/\n//;ta;D}' file

收集从tomcat.util开始并以.jar,\.jar结尾的行,删除新行直到文件末尾或错误匹配,然后删除集合。

票数 0
EN

Stack Overflow用户

发布于 2021-09-27 13:30:29

对于任何跨越行的事物,Awk通常比sed更有用。在每个Unix框上使用任何shell中的任何awk:

代码语言:javascript
复制
$ awk '!/\.jar/{f=0} /tomcat\.util/{f=1} !f' file
this is line 1

this is line 3


the end leave me
and me
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69331939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档