echo -eの反義語は何ですか?

echo -eの反義語は何ですか?

印刷できない文字、改行、またはタブを含む文字列がある場合は、文字列を印刷してechoその文字のコード(改行、\nバック\bスペースなど)を表示する方法はありますか?

答え1

からスイッチを削除し-e、オプションがまだ有効になっていない場合は、文字列を生のテキストとして印刷する必要があります。だからと文字通り表示されます。echobashxpg_echo\n\t

はい

$ echo "hi\t\tbye\n\n"
hi\t\tbye\n\n

$ echo -e "hi\t\tbye\n\n"
hi      bye

、またはの組み込みコマンドを使用してなりすましするprintfこともできます。ksh93zshbash

$ printf "%q\n" "$(echo -e "hi\t\tbye\n\nbye")"
$'hi\t\tbye\n\nbye'

bash出力は上に表示されます。シェルによっては多少のバリエーションがある場合があります。)

から抜粋help printf存在するbash

%q シェル入力で再利用できる方法で引数を引用

答え2

これを行う方法はいくつかあります。私が知る限り、最も移植性の高い2つはsedPOSIXodです。

printf '\n\r\b\t\033[01;31m' | sed -n l

readまるで...スタイルエスケープ - Cスタイルのように見えます。

出力

$
\r\b\t\033[01;31m$

odより構成可能です...

printf '\n\r\b\t\033[01;31m' |
od -v -w12 -t c -t a -A n

 \n  \r  \b  \t 033   [   0   1   ;   3   1   m
 nl  cr  bs  ht esc   [   0   1   ;   3   1   m

これらすべてのオプションが何であるかを知りたい場合は、それを見てください。しかし、私はバックスラッシュエスケープと名前付き文字man odという2種類のエスケープが欲しいと指定しました。上記のオプションはPOSIXに限定されません。-t c-t a-w

以下は、引数の各バイトの8進値をポータブルに印刷する小さなシェル関数です。もちろん、以下odも処理できます-t o

proctal() (LC_ALL=C
    for a do while [ -n "$a" ] 
    do printf %o\\n "'$a"
    a=${a#?}; done; done)  

これはとても簡単です。これは少し複雑です。ただし、printf -qシェル実装に固有の機能を実行できるはずです。

bsq() (set -f; export LC_ALL=C IFS=\'
    for a do q=${a##*\'}; printf \'
    [ -n "${a#"$q"}" ] &&
        printf "%s'\''" ${a%\'*}
    printf "%s'\n'''''\n" "$q"; done |
    sed -n "/'''''"'/!H;1h;//!d;$!n;x;l' |
    sed -e :n -e '/\\$/N;s/.\n//;tn
        s/\([^\\]\\\(\\\\\)*\)\([0-9]\)/\10\3/g
        s/\\\\'"''/\\\\''"'/g;s/$$//'
)

前の例の文字列を使用し、いくつかの追加項目を追加します。

bsq "$(printf '\n\r\'\''b\t\033[01;31m')"

出力

'\n\r\\'\''b\t\0033[01;31m'

ちょっと違うだけです。追加の0バックスラッシュがあることがわかります\b。これはread、または%b printfパラメータに簡単に変換するためのものです。たとえば、

i=0
until [ $((i=$i+1)) -gt 5 ]
do touch "\%$i$(printf 'hey\b \t;\n\033 ')"
done   #just for ugly's sake

bsq * | eval "
    printf '<%b>\n' $(tr \\n \ )
" | tee /dev/fd/2 |
sed -n l

出力

<\%1he  ;
>
<\%2he  ;
>
<\%3he  ;
>
<\%4he  ;
>
<\%5he  ;
>
<\\%1hey\b \t;$
\033 >$
<\\%2hey\b \t;$
\033 >$
<\\%3hey\b \t;$
\033 >$
<\\%4hey\b \t;$
\033 >$
<\\%5hey\b \t;$
\033 >$

答え3

次のようなものを使用できます。

$ cat filename
Ramesh is testing
New Line        is

これで、次のことができます。

$ cat -A filename

出力

Ramesh is testing$
New Line ^Iis $

文書がない別の一般的なテストは次のとおりです。

$ echo Hello$'\t'world. | cat -A

上記のコマンドの出力は次のようになります。

Hello^Iworld.$

引用する

答え4

od -c通常の文字は正常に印刷されますが、特殊文字(タブ、改行など)と印刷できない文字はprintfエスケープコードで印刷されます。

だから:

$ echo -e asdf\\nghjk\\003foo | od -c -An
   a   s   d   f  \n   g   h   j   k 003   f   o   o  \n

アドレスを出力し-Anないように指示します。od

関連情報