使用文件的内容作为程序的参数

时间:2012-01-05 13:32:50

标签: perl shell arguments

我有一个文件A,内容如下:

/filea
/fileb
/filec
/filed

我有一个脚本xyz.pl来读取一个文件并用它做一些事情

现在我想自动将文件A中的每一行作为参数提供给xyz.pl。有效地执行以下命令(按此顺序)

xyz.pl /filea
xyz.pl /fileb
xyz.pl /filec
xyz.pl /filed

有没有快速的单行命令呢?

4 个答案:

答案 0 :(得分:6)

将xargs与-n选项一起使用

cat A | xargs -n 1 xyz.pl

答案 1 :(得分:4)

bash中的单行。

$ for f in `cat A`; do xyz.pl $f; done

答案 2 :(得分:1)

您可以使用xargs。应该做的是接受'文件A'的每一行(取自cat)并执行给定(xyz.pl)的命令,并将该数据作为参数。

cat 'file A' | xargs -I{} xyz.pl '{}'

这表明{}是论证应该去的地方,并将其置于xyz.pl之后。如果您希望将来更改命令,它会更灵活。

注意,这个给定的解决方案只能假设每个文件名没有空格。

编辑:等等,它似乎适用于我的空间......

编辑:如果这在所有情况下均无效,请举例说明:

<强> xyz.pl

#!/usr/bin/perl
print "Perl processing: $ARGV[0]\n";

<强>此时就把one.txt存盘

/filea
/fileb
/filec

<强>运行:

$ cat one.txt | xargs -I{} ./xyz.pl '{}'
Perl processing: /filea
Perl processing: /fileb
Perl processing: /filec

答案 3 :(得分:1)

Perl one-liner就足够了:

perl -lnwe 'print qx(xyz.pl $_)' fileA.txt

说明:

  • -l - autochomp每一行,添加换行符(以避免与换行符不一致)
  • -n - 隐式while(<>) { .. }循环程序
  • qx() - 在shell中执行命令并返回标准输出

虽然最好的选择无疑是改变你的xyz.pl脚本也接受标准输入形式的参数。很难说你会怎么做,因为我不知道你是如何处理论证的。那么这将是一个简单的问题:

perl xyz.pl < fileA.txt

或者有一些选项,例如: Getopt::Long

perl xyz.pl -f fileA.txt    # file as argument
perl xyz.pl /foo            # simple argument