将一条长线作为多条线管道

nic*_*ten 4 bash shell scripting awk zsh

假设我有一堆XML文件,其中不包含换行符,但基本上包含一长串记录,由以下分隔 </record><record>

如果分隔符是,</record>\n<record>我将能够做一些像cat *.xml | grep xyz | wc -l计算感兴趣的记录实例的事情,因为cat会每行发出一个记录.

有没有办法在SOMETHING *.xml | grep xyz | wc -l哪里写SOMETHING每行可以流出一个记录?我尝试使用awk此功能但无法找到避免将整个文件流式传输到内存的方法.

希望问题很清楚:)

Bet*_*eta 6

这有点难看,但它有效:

sed 's|</record>|</record>\
|g' *.xml | grep xyz | wc -l
Run Code Online (Sandbox Code Playgroud)

(是的,我知道我可以把它缩短一点,但只是以清晰为代价.)

  • @nicolas:您可以使用Perl和`read`函数(而不是`<>`运算符)来读取文件的块,插入换行符并将其写出来.唯一棘手的问题是确保如果块13不够运行以便通过`</ record> <record>`序列结束,则保留尾随上下文以便与下一部分一起处理.特别要注意的是,如果Block 13以`<`或`</`结尾,则必须保留这些字符,以防Block 14启动`/ record> <record>`或`record> <record>`.我认为没有一种标准的实用程序来进行这种分裂; 大多数Unix工具都在线上工作. (2认同)