AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 564668
Accepted
snoop
snoop
Asked: 2014-12-24 06:12:14 +0800 CST2014-12-24 06:12:14 +0800 CST 2014-12-24 06:12:14 +0800 CST

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

  • 772

我有这样的文件内容:

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+

输出应该是这样的:

aaa accounting exec default ..
aaa accounting exec default
 action-type start-only
 group tacacs+
!
aaa accounting exec default ..

我试过以下sed命令:

sed -n '/aaa accounting exec default/,/!/p' AboveFileContent.txt

但这不是我想要的。

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

sed
  • 2 2 个回答
  • 1029 Views

2 个回答

  • Voted
  1. Best Answer
    glenn jackman
    2014-12-24T06:59:44+08:002014-12-24T06:59:44+08:00

    我会为此使用 awk:

    awk '
        /aaa accounting exec default/ {print; exec=1; next} 
        exec {
            if (/^ /) {print; next} else if (/^!/) {print}
            exec=0
        }
    ' filename
    

    传递模式,使用 awk 的-v选项,然后是模式匹配运算符~:

    awk -v patt='aaa accounting exec default' '
        $0 ~ patt {print; exec=1; next} 
        exec {
            if (/^ /) {print; next} else if (/^!/) {print}
            exec=0
        }
    ' filename
    
    • 2
  2. muru
    2014-12-24T06:48:23+08:002014-12-24T06:48:23+08:00

    您正在尝试以以下形式构建数据:

    aaa ...
     ...
     ...
    !
    

    您需要sed意识到缩进块很重要。一种粗略的方法可能是在中编写一个循环sed:

    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
    '
    

    在一行中:

    $ 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+
    

    我猜可以使用awk,perl或以更具可读性的方式完成。python

    • 0

相关问题

  • 使用 sed 读取字符编码

  • 将引号添加到文件中的字符串

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve