2017-04-17 6 views
0

ファイル(この場合はeximメールログ)からデータを取り出して、\ NNNのようなエスケープされた8進数のシーケンスに保存します。値0-7。これは、主語が非ラテン文字(アラビア語など)で書かれている場合に主に発生します。Unix - パイプ経由で8進数のエスケープシーケンスを変換する方法

私の目標は、utf-8対応ターミナルでこれらの8進文字を正しく表示するための最もクリーンな方法を見つけることです。特に、出力の可能性が高いため「less」です。

arbitrary_stream | { while read -r temp; do printf %b "$temp\n"; done } | less 

これはかなりうまく動作しているようですが、私はそこにいくつかの翻訳ツールである、または多分フラグが少ない」に組み込まれていることを前提となり、次のように

私がこれまでに発見した最善のアプローチです'これを処理する。また、sedのようなものを各\の後に0を挿入すると、変数として保存してから 'echo -e $ data'を使うことができますが、これは以前の解決法よりも面倒です。

テストケース:

octalvar="\342\202\254" 

以下で予想される出力:

私はどちらかの形で私の上記の解決策よりもちょうど良く、クリーナーより完全か何かを探しています:

echo $octalvar | do_something | less 

または

echo $octalvar | less --some_magic_flag 

何か提案がありますか?それとも私のソリューションは、私が期待できるほどクリーンであるか?

+0

すべての文字は8進形式ですか? – 123

+1

いいえ、それは普通のテキストとエスケープされた8進数の組み合わせです – user1869743

+1

あなたの解決策はあなたが得ようとしている最高のものです、少ないものは8進数をASCIIに変換するフラグを持っていません。おそらく 'IFS = read -r temp'の間にスペースを保存するように変更してください。 – 123

答えて

0

これは私の現在のバージョンである:(strtonumを使用するための)GNUのawkでは

echo $arbitrary | { IFS=$'\n'; while read -r temp; do printf %b "$temp\n"; done; unset IFS; } | iconv -f utf-8 -t utf-8 -c | less 
0

変換。これは、コードが混乱し、多分合理化することができるよう、アドバイスお気軽に面倒であることが判明した:

awk '{ 
    while(match($0,/\\[0-8]{3}/)) { # search for \NNNs 
     o=substr($0,RSTART,RLENGTH) # extract it 
     sub(/\\/,"0",o)    # replace \ with 0 for strtonum 
     c=sprintf("%c",strtonum(o)) # convert to a character 
     sub(/\\[0-8]{3}/,c)   # replace the \NNN with the char 
    } 
}1' foo > bar 

またはファイルabove_program.awkに単一引用符の間にコードを貼り付け、awk -f above_program.awk foo > barようにそれを実行します。テストファイルfoo

test 123 \342\202\254 

非UTF8ロケールで実行して、私は、ロケールCを使用:

$ locale 
... 
LC_ALL=C 
$ awk -f above_program.awk foo 
test 123 € 

あなたはそれをUTF8ロケールを実行した場合、変換は起こります:

$ locale 
... 
LC_ALL=en_US.utf8 
$ awk -f above_program.awk foo 
test 123 ⬠
関連する問題