如何使 sed "script" 重新启动匹配而不是退出("repeat"而不是"quit"命令)?



我很抱歉,如果这个问题已经回答,但我搜索了该网站及其几个社区,找不到有关此主题的任何信息。

我经常使用此常规sed命令在匹配STARTPAT的行中打印所有行,但不包括匹配ENDPAT的行:

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

这不能匹配FILE的多个部分,因为q UIT命令可以防止打印第二个匹配行(或者至少是i think Think 这是原因)。

我希望能够应用相同的概念全球,但无法使其正常工作。我已经尝试将g Lobal命令应用于不同点的不同点,并与pn命令相匹配,并且我还尝试使用"存储"印刷输出的方法将其全部打印在端(类似)使用sed打印包含匹配的段落)。也许我只是不了解 g lobal命令或一般范围。

我还一直在通过MAN页面查找sed和一些sed在线教程,以防sed的内置命令,它的行为与q相似,但没有退出,它重复了所提供的"脚本"并忘记了忘记先前匹配的行(以免跳过紧随另一个匹配部分的匹配部分,因为以下部分的第一个匹配项与上一场比赛中忽略的线相同)。

让我知道是否有其他信息有帮助。在此先感谢我能得到的任何帮助,即使我要离开基地或要求不存在的东西。


由请求更新 [2019-MAR-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


我在我的原始问题中引用的预先存在的命令,我将其用作bash函数的一部分,以从一个或多个软件包的apt-cache show输出中提取Description段落,为:

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

尝试:

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

这里的区别在于,当达到ENDPAT时而不是退出(q),我们只是删除了不需要的线(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

如果您可以使用awk,我也在这里添加awk变体。

awk '/ENDPAT/{flag=""}  /STARTPAT/{flag=1} flag'  Input_file

以 @john1024在他的帖子中发布的input_file的示例。

cat Input_file
omit 1
STARTPAT
keep 1
ENDPAT
omit 2
STARTPAT
keep 2
ENDPAT
omit 3

运行代码后,我们将获得以下输出。

awk '/ENDPAT/{flag=""}  /STARTPAT/{flag=1} flag'  Input_file
STARTPAT
keep 1
STARTPAT
keep 2

最新更新