示例文件:
abc
def
%separator
eee
fff
%separator
xxx
yyy
zzz
是否可以将此文件拆分为逻辑部分,即:
第1部分:
abc
def
第2部分:
eee
fff
第 3 部分:
xxx
yyy
zzz
wc -l
然后在每个部分上调用一些命令(比如)而不创建临时文件?我正在寻找的xargs
是不会内联参数,而是通过 stdin 推送它们的东西。
答案1
我不知道这样的工具。我想出了以下脚本。请根据您的需要进行调整:
#!/bin/bash
sprtr='%separator'
cmmnd='wc -l'
set -o pipefail
while ! sed -n "/^${sprtr}$/q1;p" | $cmmnd ; do
:
done
具体如下:
sed
读取stdin
直到找到给定的分隔符或 EOF,然后退出。- 所选命令从 接收适当的片段
sed
。 - 除非
$cmmnd
失败,set -o pipefail
和!
合作q1
,所以当$sprtr
被发现时,整个管道返回退出状态。这将执行和0
之间的(空)代码,然后循环,所以再次运行以便为下一个片段提供服务。do
done
sed
- 如果
$cmmnd
失败或未$sprtr
找到(到达 EOF),整个管道将返回非零退出状态。这会使脚本退出循环while
。
一些陷阱:
- 您不能字面意思地、不加思索地使用任何分隔符。如果您不转义语法中的特殊字符,某些 的值
$sprtr
将中断命令或改变其行为。示例: , 。sed
/
/q; /
set -o pipefail
我认为可以在 Bash 3 及以上版本中使用。替代方法(但不完全相同)mispipe
来自moreutils
。- 您
sed
需要了解q1
(这sed
将以退出代码退出1
)。
我承认这个解决方案不太优雅。