bash - 如何使 sed “脚本”重新启动匹配而不是退出(“重复”而不是“退出”命令)?
问题描述
如果这个问题已经得到解答,我深表歉意,但我搜索了这个网站及其几个社区,但找不到关于这个主题的任何信息。
我经常使用这个通用sed
命令来打印从匹配STARTPAT
到但不包括匹配行的所有行ENDPAT
:
sed -rn '/STARTPAT/,/ENDPAT/{/STARTPAT/{p;n};/ENDPAT/{q};p}' FILE
但是,这不能匹配 的多个部分FILE
,因为q
uit 命令阻止打印第二个匹配行(或者,至少,我认为这是原因)。
我希望能够在全球范围内应用相同的概念,但无法使其正常工作。我已经尝试将g
lobal 命令应用于模式匹配的不同点以及与p
andn
命令组合,我还尝试使用“存储”打印输出的方法在最后打印它(类似于使用sed
to打印包含匹配的段落)。也许我只是不了解g
lobal 命令或一般范围的确切含义。
我也一直在浏览手册页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
我在原始问题中引用的预先存在的命令Description
是apt-cache show
:
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
这里的不同之处在于,我们不是在到达时退出 ( 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
推荐阅读
- reactjs - React Redux Hooks 找不到状态
- javascript - javascript for 循环中的异步/等待
- deployment - 是否有可能在 CDN 上部署无头 CMS?
- python - 减少python中的if语句
- javascript - 是否可以在本地网络/热点中设置 websocket 服务器(android/ios)并通过 PWA 连接?
- java - How can I change the TextView's content by swiping horizontally?
- python-3.x - 使用 Selenium 从交互式地图中刮取图钉坐标
- scripting - adb emu kill - 等待模拟器被完全杀死
- javascript - 如何将每个对象存储在循环中?
- google-apps-script - 我可以根据日期和信息电子表格每天更新表单问题吗?