每行运行命令并以相同的方式导出

每行运行命令并以相同的方式导出

我在一个文件中有多个字符串,对于每个字符串,我需要运行一个命令并导出结果。这是一个例子:

文件.txt

string1
string2
string3

我在跑:

while read in; do sigtool --hex-dump "$in"; done < file.txt > test.txt

这提供了以下输出:

737472696e6731a737472696e6732a737472696e6733

我希望输出按如下所示的行分隔:

737472696e6731
737472696e6732
737472696e6733

我怎样才能实现这个目标?

答案1

你想要换行符。所以输出换行符。

while read in; do sigtool --hex-dump "$in"; echo; done < file.txt > test.txt

请注意添加的echo命令。

请注意,我要检查的第一个地方是sigtool手册页,看看是否有输出尾随换行符的选项。


好吧,我写了上面的内容,但没有实际sigtool(从clamav包中)获取并测试它。现在我已经这样做了。

你写的代码不起作用,至少 clamav-0.99.2-3.el6.x86_64 不行。 sigtool接受输入在其标准输入上。 它没有接受和翻译命令行参数的选项。

所以你真正想要的是,回到老喜欢的非可视化编辑器ex:

printf '%s\n' 'g/^/.!tr -d \\n | sigtool --hex-dump' %p | ex file.txt > test.txt

示范:

$ cat file.txt 
string1
string2
string3
$ printf '%s\n' 'g/^/.!tr -d \\n | sigtool --hex-dump' %p | ex file.txt > test.txt
$ cat test.txt 
737472696e6731
737472696e6732
737472696e6733
$ 

解释:

全局(对于匹配正则表达式的每一行/^/,即每一行).!通过 shell 管道过滤每一行 () tr -d \\n | sigtool --hex-dump,然后将p整个缓冲区 ()打印 ( %) 到标准输出,并且不将更改保存到file.txt.


另一种方法,使用 Awk:

awk -v p='sigtool --hex-dump' '
  {printf "%s", $0 | p; close(p); printf "\n"}
' file.txt > test.txt

答案2

替代暴力:

cat test.txt | sigtool --hex-dump | sed 's/0a/\n/g' > gzout.hex

只要处理 ASCII 文本文件,只需将十六进制换行符转换回来即可。

(如果您正在处理非 ASCII,您可能会0a出现在十六进制转储中,而不会在输入中表示换行符。)

相关内容