拆分文件并通过 stdin 传递每个部分来调用命令,无需临时文件

拆分文件并通过 stdin 传递每个部分来调用命令,无需临时文件

示例文件:

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

具体如下:

  1. sed读取stdin直到找到给定的分隔符或 EOF,然后退出。
  2. 所选命令从 接收适当的片段sed
  3. 除非$cmmnd失败,set -o pipefail!合作q1,所以当$sprtr被发现时,整个管道返回退出状态。这将执行和0之间的(空)代码,然后循环,所以再次运行以便为下一个片段提供服务。dodonesed
  4. 如果$cmmnd失败或未$sprtr找到(到达 EOF),整个管道将返回非零退出状态。这会使脚本退出循环while

一些陷阱:

  • 您不能字面意思地、不加思索地使用任何分隔符。如果您不转义语法中的特殊字符,某些 的值$sprtr将中断命令或改变其行为。示例: , 。sed//q; /
  • set -o pipefail我认为可以在 Bash 3 及以上版本中使用。替代方法(但不完全相同)mispipe来自moreutils
  • sed需要了解q1(这sed将以退出代码退出1)。

我承认这个解决方案不太优雅。

相关内容