Xpath 将每一行输入作为stdin传递,以调用实用程序

Xpath 将每一行输入作为stdin传递,以调用实用程序,xpath,parallel-processing,gnu,xargs,Xpath,Parallel Processing,Gnu,Xargs,我有一个包含有效XML的文件(每行一个),我想在每一行上逐个执行一个实用程序(xpath) 我尝试了xargs,但它似乎没有作为stdin传递该行的选项:- % 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. %cat | xa

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

我尝试了xargs,但它似乎没有作为stdin传递该行的选项:-

% 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.
%cat | xargs-p-t-l1xpath-p”//Path/to/node
无法在/System/Library/Perl/Extras/5.12/XML/XPath.pm第53行打开文件“//Path/to/node”。
我还尝试了并行——spreadstdin,但这似乎也不起作用:-

% cat <xmls-file> | parallel --spreadstdin  xpath -p "//Path/to/node"
junk after document element at line 2, column 0, byte 1607
%cat | parallel--spreadstdinxpath-p//Path/to/node”
第2行第0列字节1607处文档元素后的垃圾

如果您希望分割文件的每一行并使其成为实用程序的标准格式

可以在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
cat xmls文件|在读取行时
do(echo$f>/tmp/input$$;

xpath-p”//Path/to/node“您与GNU并行版本非常接近;只缺少-n1:

cat <xmls-file> | parallel -n1 --spreadstdin  xpath -p "//Path/to/node"
cat | parallel-n1--spreadstdinxpath-p+//Path/to/node”

谢谢。这似乎很接近,但是循环似乎在空格而不是换行符上分割了我的XML文件。我遗漏了什么?现在我想,这可能是个问题。通常与文件名列表一起使用,空格分隔。可以(我想是双引号)当它们进入文件时引用它们。还有更好的迭代方法。从另一个迭代器中,是
cat file |在读取行时;执行echo$line#或您希望对$line变量执行的任何操作;完成
Yes。这很有效。您可能需要相应地更新您的答案。是的。这正是我想要的。