印刷できない文字を含む変数を印刷するには?

印刷できない文字を含む変数を印刷するには?

$IFS印刷できない文字(改行文字など)を含めることができる変数の値を表示したいと思います。

これを行うには、次のコマンドを使用します。

echo -n "$IFS" | hexdump -C

これは私にとってうまくいきます。

しかし、このコマンドを使用するのに問題がありますか?たとえば、echo印刷できない文字を印刷する前に他の文字に置き換えますか?stdoutそれとも同様の問題がありますか?

ベストアンサー1

文字列を視覚的に表現するいくつかの異なる方法:

POSIX

$ printf %s "$IFS" | od -vtc -to1
0000000      \t  \n  \0
        040 011 012 000
0000004
$ printf '%s\n' "$IFS" | LC_ALL=C sed -n l
 \t$
\000$

(追加のコンテンツが\n必要です。そうしないと、sed最後の行が改行文字で終わらない限り動作は指定されません。)POSIXには、私のzshのようにNULはありませんsh。入力に ​​NUL が含まれている場合、動作は指定されません。$IFSsed

シェル組み込み関数

  • typeset -p(ksh、zsh、bash、yash)は特定の文字列の明示的な出力を提供できます。

    $ ksh93 -c 'typeset -p IFS'
    IFS=$' \t\n'
    $ zsh -c 'typeset -p IFS'
    typeset IFS=$' \t\n\C-@'
    $ mksh -c 'typeset -p IFS'
    typeset IFS=$' \t\n'
    $ a=$'\u00e9e\u301\u200b' ksh -c 'typeset -p a'
    typeset -x a=$'\u[e9]e\u[301]\u[200b]'
    

    ただし、後者(鋭角アクセントと幅0の空白文字を結合するためにUnicodeを使用する場合)の場合、zsh / mkshは役に立ちません(にもかかわらずLC_ALL=C typeset -p amksh -o utf8-modebash端末に送信されると、出力は通常明確ではありません。

  • printf %qprintfGNUprintfの組み込み機能を使用しksh93て、次の操作を行いますzshbash

    $ a=$'\u00e9e\u301\u200b' bash -c 'printf "%q\n" "$IFS" "$a" ""'
    $' \t\n'
    éé​
    ''
    $ a=$'\u00e9e\u301\u200b' ksh -c 'printf "%q\n" "$IFS" "$a" ""'
    $' \t\n'
    $'\u[e9]e\u[301]\u[200b]'
    ''
    \ $'\t'$'\n'$'\0'
    éé​
    ''
    $ a=$'\u00e9e\u301\u200b' sh -c '/usr/bin/printf "%q\n" "$IFS" "$a" ""'
    ' '$'\t\n'
    éé​
    ''
    $ a=$'\u00e9e\u301\u200b' zsh -c 'LC_ALL=C printf "%q\n" "$IFS" "$a" ""'
    \ $'\t'$'\n'$'\0'
    $'\303'$'\251'e$'\314'$'\201'$'\342'$'\200'$'\213'
    ''
    $ a=$'\u00e9e\u301\u200b' bash -c 'LC_ALL=C printf "%q\n" "$IFS" "$a" ""'
    $' \t\n'
    $'\303\251e\314\201\342\200\213'
    ''
    
  • q、、qqのパラメータ拡張フラグqqqqqqqzsh

    さまざまな種類の参照についてはqqqq次のとおりです$'...'

    $ a=$'\u00e9e\u301\u200b' zsh -c 'print -r -- ${(qqqq)a}'
    $'éé​'
    $ a=$'\u00e9e\u301\u200b' zsh -c '(){local LC_ALL=C; print -r -- ${(qqqq)a}}'
    $'\303\251e\314\201\342\200\213'
    

    次への参照のみを使用してくださいqq+必要はい(Unicodeに関する警告はまだ存在しますが)。

さまざまな非標準コマンド:

  • hex-dumper:hexdump、、、...供給する出力(またはksh / zshを使用するか...hdを使用)。xxdprintf %s "$var"print -rn -- "$var"echo -nE - "$var"zsh

  • cat -vteまたはcat -A

  • uconv -x hex文字のUnicodeコードポイント(エンコードされたバイトの16進値ではない)の場合は、UTF-8でのみ機能します(入力は前処理できますが、iconv -t utf-8ロケールエンコーディングで有効なテキストである場合のみ)。

  • uconv -x name役割名の場合

  • recode ..dump。 16進数と名前ですが、少数のUnicode文字を理解しています(最新バージョンのUnicodeに更新されていません)。ただし、UTF-8以外のロケールでは機能します。

おすすめ記事