首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用sed查找两个模式之间的字符串?

如何使用sed查找两个模式之间的字符串?
EN

Ask Ubuntu用户
提问于 2014-12-23 14:12:14
回答 2查看 1K关注 0票数 0

我有这样的文件内容:

代码语言:javascript
复制
aaa accounting exec ...
aaa accounting exec ...
aaa accounting commands ..
aaa accounting commands ..
aaa accounting commands ..
aaa accounting commands ..
aaa accounting commands ..
aaa accounting commands ..
aaa accounting network ..
aaa accounting connection ..
aaa accounting system ..
!
aaa accounting exec default
 action-type start-only
 group tacacs+
!
aaa accounting exec default stop-only group tacacs+

输出应该如下:

代码语言:javascript
复制
aaa accounting exec default ..
aaa accounting exec default
 action-type start-only
 group tacacs+
!
aaa accounting exec default ..

我尝试了以下sed命令:

代码语言:javascript
复制
sed -n '/aaa accounting exec default/,/!/p' AboveFileContent.txt

但这不是我想要的。

解决办法是什么?我也尝试过使用awk,但同样的结果即将到来。得到准确输出的命令是什么?

EN

回答 2

Ask Ubuntu用户

回答已采纳

发布于 2014-12-23 14:59:44

我会用awk来做这个:

代码语言:javascript
复制
awk '
    /aaa accounting exec default/ {print; exec=1; next} 
    exec {
        if (/^ /) {print; next} else if (/^!/) {print}
        exec=0
    }
' filename

传递模式,使用awk的-v选项,然后模式匹配操作符~

代码语言:javascript
复制
awk -v patt='aaa accounting exec default' '
    $0 ~ patt {print; exec=1; next} 
    exec {
        if (/^ /) {print; next} else if (/^!/) {print}
        exec=0
    }
' filename
票数 2
EN

Ask Ubuntu用户

发布于 2014-12-23 14:48:23

您正在尝试将数据结构化为以下形式:

代码语言:javascript
复制
aaa ...
 ...
 ...
!

您需要让sed意识到缩进块很重要。一种简单的方法可能是用sed编写一个循环:

代码语言:javascript
复制
sed -n '
# Create a label named 'start'
:start
# If the line matches the beginning of a block, 
# jump (branch) to the label named section
/aaa accounting exec default/ b section
# If we didn't branch, get the next line
n
# Jump back to the start label
b start
# The label named section
:section
# print the line
p
n
# Keep looping to section for the lines we need
/^ /,/!/ b section
# If we don't have any more lines to loop on, 
# jump back to the beginning
b start
'

一行:

代码语言:javascript
复制
$ sed -n ':start; /aaa accounting exec default/ b section; n; b start; :section; p; n; /^ /, /!/ b section; b start' test.txt
aaa accounting exec default start-stop group tacacs+
aaa accounting exec default
 action-type start-only
 group tacacs+
!
aaa accounting exec default stop-only group tacacs+

我想,可以使用awkperlpython,以一种更易读的方式来完成。

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

https://askubuntu.com/questions/564668

复制
相关文章

相似问题

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