我很抱歉,如果这个问题已经回答,但我搜索了该网站及其几个社区,找不到有关此主题的任何信息。
我经常使用此常规sed
命令在匹配STARTPAT
的行中打印所有行,但不包括匹配ENDPAT
的行:
sed -rn '/STARTPAT/,/ENDPAT/{/STARTPAT/{p;n};/ENDPAT/{q};p}' FILE
这不能匹配FILE
的多个部分,因为q
UIT命令可以防止打印第二个匹配行(或者至少是i think Think 这是原因)。
我希望能够应用相同的概念全球,但无法使其正常工作。我已经尝试将g
Lobal命令应用于不同点的不同点,并与p
和n
命令相匹配,并且我还尝试使用"存储"印刷输出的方法将其全部打印在端(类似)使用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