linux - 如何在不将其通过管道传输到自身的情况下第二次制作 sed 编辑流?

标签 linux bash sed

我有一个 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/

相关文章:

linux - Linux 启动/关闭时的日志脚本

linux - 尝试 grep 位置参数

bash - 使用 BASH 在文件夹名称中搜索带有空格的子文件夹

linux - 如何从apk版本命令返回的结果中去掉\n

linux - 2 个字符串的所有排列和组合的列表

linux - 在 Nodester 安装中丢失

bash - 使用具有各种引号级别和空格的变量构建命令字符串

linux - 如何将 "read -p"之后的文字加粗?

awk - 用键分隔行并存储在不同的文件中

regex - 当扩展正则表达式 (ERE) 选项与 sed 一起使用时,为什么美元不匹配文字美元?