首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >sed -保持空间的行为

sed -保持空间的行为
EN

Stack Overflow用户
提问于 2012-04-04 19:39:24
回答 1查看 167关注 0票数 1

我(从sed网站http://sed.sourceforge.net/sed1line.txt)获得了这条消息:

代码语言:javascript
代码运行次数:0
运行
复制
sed -e '/./{H;$!d;}' -e 'x;/AAA/!d;/BBB/!d;/CCC/!d'

它的目的是搜索一个段落的AAA,BBB或CCC。

我对剧本的理解:

/./‘匹配每一行不是空的holdspace

  • '/AAA/!d’‘{}’括号内的所有命令都处理匹配的行

  • ‘H’以匹配行

  • ‘$!d’从模式空间中删除所有内容,但最后一行

H 111/code>‘x’交换模式,并由

  • 搜索H 214F 215

我不清楚的是:

  1. 在保留空间应该是几行单独的(对于每一段),为什么我能够搜索整个段落呢?保留空间中的行是否合并成一行?
  2. 和sed如何知道一个段落何时结束,另一个段落以“$!d”开头,为什么'$d‘还不够?为什么我不能省略'-n‘,使用'$p’而不是'$!d‘在这个例子中?

非常感谢您的每一个评论!

我的测试数据(将每一段与其中的XX匹配):

代码语言:javascript
代码运行次数:0
运行
复制
YYaaaa
aaa1
aaa2
aXX3
aaa4

YYbbbb
bbb1
bbb2

YYcccc
ccc1
ccc2
ccc3
cXX4
ccc5

YYdddd
ddd1
dXX2

使用以下命令:

代码语言:javascript
代码运行次数:0
运行
复制
sed -ne '/./{H;$!d};x;/XX/p' test2

版本:

代码语言:javascript
代码运行次数:0
运行
复制
$ sed --version
GNU sed-Version 4.2.1
$ bash --version
GNU bash, Version 4.2.10(1)-release (x86_64-pc-linux-gnu)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-04 19:45:15

它将一个段落作为单独的行收集到“保持空间”(H)中,然后当您单击一个空行时,/./会失败,并且它会掉到x,该x基本上会为下一段划出保持空间。

为了正确处理最后一段,它需要处理一个没有空行的段落,因此它从最后一行掉下来,就好像后面跟着空行一样。这是一个常见的习惯用法,用于通过特定模式收集某些内容的脚本(或者,换句话说,此类脚本在文件结束时无法处理最后收集的数据是常见的错误)。

换句话说,如果我们正在查看一个非空行,将其添加到looking空间,除非它是文件中的最后一行,否则删除它,然后从脚本的开头开始,使用下一个输入行。(也许你对d的理解还不够完整?)这就是$!d的意思。)

否则,我们有一个空的行,或者文件的末尾,并且保持空间包含零行或多行文本(一段,可能是空的)。将它们转换到模式空间(当前、空、行方便地移动到保持空间)并检查模式空间。如果它与我们的一个表达式不匹配,请删除它。否则,默认操作是打印整个模式空间。

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

https://stackoverflow.com/questions/10018098

复制
相关文章

相似问题

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