我有一个 bash 脚本需要连续编辑一个监控命令,因此我只能使用一个管道,否则不会生成任何输出。我想 sed 编辑已经编辑过的流,但在一个脚本中进行
这个命令生成了一堆关于wm的信息
bspc subscribe report
输出:
WMeDP-1:oI:OII:oIII:fIV:fV:fVI:fVII:oVIII:oIX:oX:LT:TT:G
WMeDP-1:oI:oII:oIII:fIV:FV:fVI:fVII:oVIII:oIX:oX:LT
WMeDP-1:oI:oII:oIII:fIV:fV:FVI:fVII:oVIII:oIX:oX:LT
WMeDP-1:oI:oII:oIII:fIV:fV:fVI:FVII:oVIII:oIX:oX:LT
这个
bspc subscribe report | sed 's|:|\n|g'
工作正常
输出:
WMeDP-1
oI
OII
oIII
fIV
fV
fVI
fVII
oVIII
oIX
oX
LT
TT
G
...
但是我需要解析每一行新生成的流,但是像这样的管道不是一个选项
bspc subscribe report | sed 's|:|\n|g' | sed '|^O| {...} ...'
我试过做多重表达
sed -e 'something' -e 'something'
我试过用 y 代替 s
我试过交换保持和模式空间,但没有任何效果
我是 sed 的新手,所以我很确定我错过了什么,请帮助
最佳答案
当您通过替换注入(inject)换行符时,模式空间将包含多行表达式(因此行首的 O
不一定与正则表达式 ^O
).在这种情况下,简单的修复是切换脚本中命令的顺序。
sed -e 's/\(^\|:\)O/{ ... stuff ... }' -e 'y/:/\n/'
如果没有关于 ... stuff ...
中内容的更多信息,则无法更详细地说明这是否适合您。也许您的 ... stuff ...
需要额外的重构;或者也许最简单的解决方案实际上是运行 sed
两次。一些 sed
版本有一个 -u
或 --unbuffered
选项,可以帮助解决在交互式管道中运行多个脚本的问题。
也许 sed
脚本可以重构为在替换后遍历每个字段;但同样,如果没有更详细的要求,这必然是相当模糊的。请查看 sed
手册中的 :
和 b
条目。
最后,sed
是一种只写语言。很多时候,您想切换到更友好的语言,如 Awk 来进行任何重要的处理,以提高可读性和可维护性。功能集和处理模型也比 sed
的功能强大得多。
关于linux - 如何在不将其通过管道传输到自身的情况下第二次制作 sed 编辑流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947568/