1

我有一个包含有效 xml(每行一个)的文件,我想在每一行上一个接一个地执行一个实用程序(xpath)。

我尝试了 xargs ,但似乎没有选项将行作为标准输入传递:-

% cat <xmls-file> | xargs -p -t -L1 xpath -p "//Path/to/node"

Cannot open file '//Path/to/node' at /System/Library/Perl/Extras/5.12/XML/XPath.pm line 53.

我也尝试过并行 --spreadstdin 但这似乎也不起作用:-

% cat <xmls-file> | parallel --spreadstdin  xpath -p "//Path/to/node"
junk after document element at line 2, column 0, byte 1607
4

2 回答 2

1

如果您希望文件的每一行都被拆分并为实用程序制作标准输入

您可以在 bash shell 中使用 for 循环:

cat xmls-file | while read line
do ( echo $f > /tmp/input$$; 
     xpath -p "//Path/to/node" </tmp/input$$
     rm -f /tmp/input$$
);
done

$$ 附加进程 ID 号,创建唯一名称

我假设 xmls-file 在每一行都包含您想要迭代的内容$f,并且您希望它作为命令行的标准输入,而不是作为命令的参数。

另一方面,您的规范可能不正确,您可能需要将每一行作为命令的一部分。在这种情况下,删除 echo 和 rm 行,并将 xpath 命令更改为在文件中需要该行的地方包含 $f。

我没有做太多的 XML,所以可能需要编辑 do 命令。

于 2013-08-12T05:57:13.917 回答
1

您与 GNU Parallel 版本非常接近;仅缺少 -n1:

cat <xmls-file> | parallel -n1 --spreadstdin  xpath -p "//Path/to/node"
于 2013-08-12T18:03:46.013 回答