首页 > 解决方案 > 如何使 sed “脚本”重新启动匹配而不是退出(“重复”而不是“退出”命令)?

问题描述

如果这个问题已经得到解答,我深表歉意,但我搜索了这个网站及其几个社区,但找不到关于这个主题的任何信息。

我经常使用这个通用sed命令来打印从匹配STARTPAT到但不包括匹配行的所有行ENDPAT

sed -rn '/STARTPAT/,/ENDPAT/{/STARTPAT/{p;n};/ENDPAT/{q};p}' FILE

但是,这不能匹配 的多个部分FILE,因为quit 命令阻止打印第二个匹配行(或者,至少,我认为这是原因)。

我希望能够在全球范围内应用相同的概念,但无法使其正常工作。我已经尝试将global 命令应用于模式匹配的不同点以及与pandn命令组合,我还尝试使用“存储”打印输出的方法在最后打印它(类似于使用sedto打印包含匹配的段落)。也许我只是不了解global 命令或一般范围的确切含义。

我也一直在浏览手册页sed和一些sed在线教程,以防已经有一个内置命令,sed其行为类似于q但不是退出,而是重复提供的“脚本”并忘记先前匹配的行(所以因为不跳过紧跟在另一个匹配部分之后的匹配部分,因为该后续部分的第一个匹配是在前一个匹配中被忽略的同一行)。

让我知道是否有任何其他信息会有所帮助。提前感谢我能得到的任何帮助,即使我离基地很远,或者正在要求一些根本不存在的东西。


应要求更新[2019 年 3 月 11 日]:

使用John1024提供的原始解决方案,我试图构建的具体命令是:

apt-cache depends --recurse --no-suggests --no-recommends --no-conflicts \
--no-breaks --no-replaces --no-enhances gdm3 | \
sed -rn '/^\S*(unity|ubuntu|desktop|session)/,/^\S+/{/^\S*(unity|ubuntu|desktop|session)/{p;n};/^\S+/d;p}'

这是一些示例输出:

  Depends: libxtst6
gnome-session
  Depends: gnome-settings-daemon
gnome-session-flashback
  Depends: dbus-user-session
    dbus-user-session:i386
  Depends: gnome-session-bin
  Depends: gnome-session-common
  Depends: gnome-settings-daemon
  Depends: indicator-common
  Depends: nautilus
  Depends: systemd
    systemd:i386
lxqt-session
  Depends: libc6

当我使用John1024提供的简化解决方案时:

apt-cache depends --recurse --no-suggests --no-recommends --no-conflicts \
--no-breaks --no-replaces --no-enhances gdm3 | \
sed -rn '/^\S*(unity|ubuntu|desktop|session)/,/^\S+/{/^\S+/d;p}'

输出不包含任何匹配的行/^\S+/,这意味着不显示“顶级”依赖项名称,并且完全跳过了一些应该显示的依赖项集。这是输出的片段,理想情况下,它将与前面的示例相匹配:

  Depends: libxtst6
  Depends: dbus-user-session
    dbus-user-session:i386
  Depends: gnome-session-bin
  Depends: gnome-session-common
  Depends: gnome-settings-daemon
  Depends: indicator-common
  Depends: nautilus
  Depends: systemd
    systemd:i386
  Depends: libc6
  Depends: libglib2.0-0
  Depends: libgtk2.0-0
  Depends: libx11-6
  Depends: lsb-release


我在原始问题中引用的预先存在的命令Descriptionapt-cache show

apt-cache show ${pkg} | \
sed -rn '/^Description(-en)?/,/^[^: ]+:/{/^Description(-en)?/{p;n};/^[^: ]+:/{q};p}'

标签: bashawksed

解决方案


尝试:

sed -rn '/STARTPAT/,/ENDPAT/{/STARTPAT/{p;n};/ENDPAT/d;p}' file

这里的不同之处在于,我们不是在到达时退出 ( q) ENDPAT,而是简单地删除不需要的行 ( d)。

例子

考虑这个测试文件:

$ cat file
omit 1
STARTPAT
keep 1
ENDPAT
omit 2
STARTPAT
keep 2
ENDPAT
omit 3

让我们运行我们的命令:

$ sed -rn '/STARTPAT/,/ENDPAT/{/STARTPAT/{p;n};/ENDPAT/d;p}' file
STARTPAT
keep 1
STARTPAT
keep 2

简化

$ sed -rn '/STARTPAT/,/ENDPAT/{/ENDPAT/d;p}' file
STARTPAT
keep 1
STARTPAT
keep 2

推荐阅读