在文件的每一行上运行命令。

3

我有一个名为FramesList.txt的文件,其中包含5个.xml文件的文件名。由于该列表是通过xml ls > FramesList.txt命令创建的,因此没有生成路径。

我想在列出的每个.xml文件上运行xmlstarlet命令。

FramesList.txt
FR0391W.xml
FR0921S.xml
FR0193A.xml
FR0192B.xml
FR0132E.xml

这会是什么样子?它是一个循环吗?

4
虽然这个问题可能会得到解答,但你应该展示一下你的研究和尝试过的内容。现在看起来像是你期望我们来帮你解决问题。 - moffeltje
1
你尝试过什么?请[编辑]你的问题,展示你遇到问题的代码[mcve],这样我们就可以帮助你解决具体的问题。你还应该阅读[ask]。 - Toby Speight
抱歉大家,我甚至不知道在这里使用什么命令... 感谢andlrc向我展示了xargs。我是一个完全的新手,在之前并不知道xargs。 - buzzin
3个回答

17

你可以使用 xargs

xargs < FramesList.txt -n 1 xmlstartet
#       ^               ^   ^
#       |               |   Command to run
#       |               Max number of arguments (xmlstartet will be called for
#       |               each line in input file)
#       Input file

我建议也使用-r选项,以防万一输入文件为空。 - user1934428
1
@andlrc 这很有帮助,但是当我将xmlstarlet输出到.csv时,我失去了格式。它会变成一行,而不是有换行符。相反,我选择了以下方式:cat FramesList.txt | xargs xmlstarlet -n > FrameInfo.csv 不确定为什么需要那个-n,但这是恢复正确格式的方法。 - buzzin
似乎这个命令将所有参数连接在一行上,你需要包含“-L1”才能每行得到一个命令。 - Neil Traft

4
while  read -r line
do

xmlstarlet "$line"

done <FramesList.txt

通常应该使用 read -r 以不特殊处理任何反斜杠。对于 OP 的情况,这可能不是问题。还要记得引用变量扩展:xmlstartet "$line",否则它将经历单词分割。 - Andreas Louv

0

我认为大多数XML Starlet命令都接受多个文件作为参数,而且由于您的输入列表很小,您也可以编写

xml COMMAND $(<FramesList.txt)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接