【问题标题】:pipe each line of a file to a command将文件的每一行通过管道传递给命令
【发布时间】:2013-06-17 08:00:02
【问题描述】:

我有一个文本文件,其中每一行分别是一个单词编码的 base64。现在我想解码它。我正在尝试使用 base64 命令行,但我只在一行中获取所有单词,我想要每行一个。

比如我的文件是:

Y2F0Cg==
ZG9nCg==
aG91c2UK

我想要结果:

dog
cat
house

但我得到:

dogcathouse

我认为 xargs 可以提供帮助,但我没有理解重点。

【问题讨论】:

  • 您可能想要更改问题的标题,因为它实际上并不是要遍历文件。
  • @l0b0:我不这么认为。因为OP认为它需要循环。但是,有更好的解决方案可用。

标签: shell command-line base64 xargs


【解决方案1】:

base64 --decode 与循环一起使用:

$ while IFS= read -r line; do echo "$line" | base64 --decode; done < file
cat
dog
house

【讨论】:

  • 对我来说,这消耗了所有换行符,就像其他解决方案一样。必须在echo $line | base64 --decode; 之后添加echo "";
  • @caw 我的循环有点糟糕,我只是在其中添加了一些安全性。你想检查一下它现在是否适合你吗?
  • 谢谢,但这实际上并没有任何区别。经过一些简短的调试,我在这里找到了关键元素:如果你将echo "dog" | base64 的结果放入每一行,你的代码就可以工作。但是如果将echo -n "dog" | base64 的结果(注意-n 选项)放入每一行,它就不起作用。所以它要求实际的(Base64 编码的)数据已经以换行符结尾。因此,对于所有可能的输入,您的代码的工作方式与简单的base64 -d file 相同。无论如何,正如我之前建议的那样,为换行添加额外的 echo "" 会使您的代码在其他情况下工作。
  • @caw 好吧,base64 --decodebase64 -d 相同。关于echo -n的使用,意思是“不输出尾随换行”,所以相当于printf(需要printf "bla\n"才有换行)。无论如何,我看不到您在此处查找的内容:在文件末尾有一个新行?
  • 我知道这些命令和参数。我的观点是,您的解决方案似乎提供了与另一个答案中建议的简单 base64 -d file 完全相同的结果,但更复杂。因此,似乎没有任何情况下您的解决方案可能优于另一个解决方案。强调什么不起作用(或我在这里寻找什么):如果您的文件包含带有 Base64 编码版本的 dogcathouse 的行 - 并且 不是 i> dog\ncat\nhouse\n - 你的解决方案(和另一个)将准确地显示问题试图解决的问题。
【解决方案2】:

这在base64 8.13 中适用于我:

base64 --decode test.txt

无需拆分文件。你用的是哪个版本?

【讨论】:

  • 好,我认为有必要循环遍历文件。
  • 我用过这个,但没用。我认为这是因为该文件并非完全采用 base64 编码。事实上,每个单词都是单独编码的,然后放在一个文件中。
【解决方案3】:

您可以为此使用 Python(无需阅读每一行):

python -m base64 -d foo.txt

【讨论】:

    【解决方案4】:

    您可以为此使用 bash here-document &lt;&lt;&lt;

    cat FILE | xargs -I{} bash -c 'base64 -d <<< {}'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 2023-01-26
      • 2019-12-07
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多