【问题标题】:Use content of a file as argument for program使用文件的内容作为程序的参数
【发布时间】:2023-04-06 23:48:01
【问题描述】:

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

/filea
/fileb
/filec
/filed

我有一个脚本 xyz.pl 来读取一个文件并对其进行处理

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

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

是否有任何快速的单行命令可以做到这一点?

【问题讨论】:

  • 为什么不向xyz.pl 添加一些功能,以便您可以将文件名作为参数传递,或者从 STDIN 接收参数?
  • 这不是我的程序,所以我不想乱码。
  • 是否禁止复制程序和重写输入函数?
  • 我有理由不这样做。当然你可以打开一个黑匣子来编辑它,但是如果其他人正在使用它并且你破坏了系统的其他部分怎么办?
  • 我不知道你的情况,所以我真的不能说你应该做什么或不应该做什么。如果 xargs 为您做这件事,对您有好处。就我个人而言,我是一个在任何情况下都在寻找完美解决方案的人,而在这种情况下,完美的解决方案就是更改原始脚本。

标签: perl shell arguments


【解决方案1】:

将 xargs 与 -n 选项一起使用

cat A | xargs -n 1 xyz.pl

【讨论】:

    【解决方案2】:

    bash 中的单行代码。

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

    【讨论】:

    • 在其中添加失败检查可能是个好主意,如果其中一个迭代失败则中止循环。
    • 避免使用猫,并结合Donal的建议:while read arg; do xyz.pl "$arg" || break; done < A
    【解决方案3】:

    您可以使用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
    

    【讨论】:

    • 这不会将行作为参数一一传递
    • 您的代码带有 I 选项将起作用,我在您编辑之前发布过我猜:P
    • 感谢您尝试...对更一般的案例投赞成票,对我的案例来说有点复杂
    【解决方案4】:

    Perl 单行就足够了:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      • 2014-01-30
      • 1970-01-01
      • 2012-08-08
      相关资源
      最近更新 更多