1行ずつコマンドを実行し、同じ方法でエクスポートします。

1行ずつコマンドを実行し、同じ方法でエクスポートします。

ファイルに複数の文字列があり、各文字列に対してコマンドを実行して結果をエクスポートする必要があります。例は次のとおりです。

ファイル.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
$ 

説明する:

グローバルに(regexに一致するすべての行/^/、つまりすべての行に対して).!シェルパイプを介して各行()をフィルタリングし、バッファ全体tr -d \\n | sigtool --hex-dumpp)を%標準出力に印刷()し、変更を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テキストファイルを扱うたびに、16進改行文字を再変換するだけです。

(ASCII以外の言語を扱うと、0a入力に改行文字が表示されていないまま16進ダンプが発生する可能性があります。)

関連情報