我在一个文件中有多个字符串,对于每个字符串,我需要运行一个命令并导出结果。这是一个例子:
文件.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
出现在十六进制转储中,而不会在输入中表示换行符。)