Unicodeテキストを読みやすい形式に変換しようとしています。 -tフラグを使用して実行する前に、xargsがどのコマンドを実行するかを確認します。私は次のような奇妙な点を見つけました。
$ echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
echo -e "\t\u0042\u0065\u006e"
" \u0042\u0065\u006e"
ただし、手動で実行すると、次のようになります。
$ echo -e "\t\u0042\u0065\u006e"
Ben
$
\t
これは両方の例で正しく処理されます。ただし、\u00XX
最初の例では値は通常の文字列として扱われますが、2番目の例では正しくエンコードされています。私もそれを使用するときとprintf
同じ奇妙な行動を見ます。
$echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' printf \"{}\"
printf "\t\u0042\u0065\u006e"
" printf: invalid universal character name \u0042
$ printf "\t\u0042\u0065\u006e"
Ben
何が起こっているのか、どのように解決するのかというアイデアはありますか?
答え1
Daveの言葉は正しいです。関連するシェルがないので、エコーは/ bin / echoです。以下を試してください。
echo "\\\t\\\u0042\\\u0065\\\u006e" | od -c
echo "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
# echo -e '"'\t\u0042\u0065\u006e'"'
/bin/echo -e '"'\\t\\u0042\\u0065\\u006e'"'
結果:
0000000 \ \ t \ \ u 0 0 4 2 \ \ u 0 0 6
0000020 5 \ \ u 0 0 6 e \n
0000031
" \u0042\u0065\u006e"
" \u0042\u0065\u006e"
echo -e "\t\u0042\u0065\u006e"
試験を終えたオンラインbashシェル