linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行

linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行,第1张

概述我知道sed使用以下命令从test.txt打印单词FOO和BAR之间的行 sed -n '/FOO/,/BAR/p' test.txt 但是,只有当其中一条线具有匹配的图案时,我如何使sed打印FOO和BAR之间的线条 例如,文件text.txt包含以下行: Error- Undefined portline1line2Undefined port in ALU1 line3Error 我知道sed使用以下命令从test.txt打印单词FOO和bar之间的行

sed -n '/FOO/,/bar/p' test.txt

但是,只有当其中一条线具有匹配的图案时,我如何使sed打印FOO和bar之间的线条

例如,文件text.txt包含以下行:

Error- Undefined portline1line2Undefined port in ALU1 line3Error- Undefined portline4line5Undefined port in LSU line6Error- Undefined portline7line8Undefined port in FGU line9 Error- Undefined portline10line11Undefined port in ALU2 line12

我想在两次连续出现之间打印出行
 仅当其中一行包含单词“ALU”时,单词“Error”.

所以我只想打印出以下错误消息:

Error- Undefined portline1line2Undefined port in ALU1 line3Error- Undefined portline10line11Undefined port in ALU2 line12
解决方法 要实现这一点,您需要在sed脚本中分支并保留缓冲区.

该脚本使用两个缓冲区:模式缓冲区(它是sed存储当前处理的行的缓冲区,用于模式匹配测试的缓冲区)和保持缓冲区(用于存储前一行的缓冲区).我们的想法是存储上一个/错误/模式匹配的所有行,并在下一个/错误/匹配或流结束时检查/ ALU /出现.

sed -n '# if /Error/ pattern occured,jump to /ALU/ check/Error/ b alu_check# else append current line to the hold bufferH# if the current line is the last one,jump to /ALU/ check$b alu_check# otherwise jump to end of script (= finish processing of this line)b# alu_check::alu_check# exchange current pattern buffer with hols buffer contextx# print prevIoUs record if /ALU/ occured/ALU/ p'

x命令用保持缓冲区上下文(从上次记住的内容)交换模式缓冲区上下文(当前行) – 注意它将当前行/ Error / pattern存储到保持缓冲区以供下次使用

H将当前行上下文附加到保持缓冲区

总结

以上是内存溢出为你收集整理的linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行全部内容,希望文章能够帮你解决linux – sed:只有当其中一行匹配第三个单词或任何模式时,才会在两个单词之间打印行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/yw/1021060.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存