echo -eの逆は何ですか?


13

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


2
printfコマンドを使用できます
。manprintf

12
e- ohce*リムショット*
デビッドリチャービー14

3
printf '%q' "$str"エスケープされた文字列を出力します。私はこれを答えとして追加していません。なぜなら、それecho -eは使用するのと同じエスケープの形式ではない-むしろ、それはeval-safeであることを意図しています-しかし、(1)あなたの目標が人間の可読性であれば十分です、(2)それは目標が安全なシェル生成であり、(3)echo -eとにかく悪である(POSIX仕様を読むと、printfが文字列の書式設定を行う好ましい方法であり、echo -ePOSIXのベースラインによって保証されていない場合、すべて)。
チャールズダフィー14

回答:


7

これを行うには多くの方法があります。私が知っていることが最もポータブル2があるsedod、彼らは両方のPOSIXです- 。

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-t cバックスラッシュエスケープと-t a名前付き文字の2種類のエスケープが必要であることを指定します。-w上記の使用オプションは、POSIX-指定されていません。

そして、ここに、引数の各バイトの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 >$

@StéphaneChazelasそれはまだシングルバイト文字のみを実行しますが、うまくいけば今はめちゃくちゃになる可能性が低くなります。
mikeserv 14

1
10kマークを取得させてください:)
ラメシュ14

うわー!!!!!!!!!
slm

@slm-推測させてくださいproctal
mikeserv 14

@StéphaneChazelas-何か考えはありますかbsq()-何も欠けていますか?私はバックスラッシュについて完全に自信がないので尋ねます。
mikeserv 14

12

あなたが削除するとき-eにスイッチをechoして、bashし、提供xpg_echoオプションが有効になっていない、それはより多くの、元のテキストより何として文字列を印刷する必要があります。だから、\nおよび\tなど、文字通りその現れだろう。

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

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

また、使用することができるprintfの組み込みコマンドをksh93zshまたはbash、同様にこれをfinagleします。

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

bash上記の出力。シェルに応じていくつかのバリエーションがあります)。

以下からの抜粋help printfbash

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


1
それprintf %qは末尾\nのsを切り捨てるのではなく、$()それらを取り除く出力キャプチャです。
ecatmur

@ecatmur-深夜にそれを書いたので、それをさらにデバッグしようとしなかった。あなたは正しいでしょう、それを取り除くのはサブシェルです。その理由は次のとおり
slm

...とにかく、printfサブシェルの内部で実行して出力をキャプチャするのはばかげています。printf -v varname出力サブシェルを使用せずに変数に直接格納するからです。
チャールズダフィー14

@CharlesDuffy-私はあなたに従っていません、私はprintfサブシェルで実行していませんecho、純粋にあなたが特別な文字出力を取り出しechoてエスケープ表記に戻すことができることを示すために1つで実行していました。
slm

@slm、これは最初のコメント(最初のコメントが応答したコード)への応答であり、現在見つかったコードではありません。以前の編集状態について不正確なものを推測した場合、おologiesび申し上げます。
チャールズダフィー14

5

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

$ 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
それとも、猫の非GNUの実装では、例えばMacOSの/ X、獣医にあなたの猫を取る... 猫-vet
ティンク

3

zsh、そこにある(q)(qq)(qqq)(qqqq)できる変数展開フラグ引用さまざまな方法で変数を:

$ a=$'a b\nba\bc\u00e9\0'

$ printf '%s\n' $a
a b
bcé

$ printf %s $a | od -vtc
0000000   a       b  \n   b   a  \b   c 303 251  \0
0000013

$ printf '%s\n' ${(q)a}
a\ b$'\n'ba$'\b'cé$'\0'

$ printf '%s\n' ${(qq)a}
'a b
bcé'

$ printf '%s\n' ${(qqq)a}
"a b
bcé"

$ printf '%s\n' ${(qqqq)a}
$'a b\nba\bcé\0'

$ (){local LC_ALL=C; print -r -- ${(qqqq)a}}
$'a b\nba\bc\303\251\0'

あなたの場合、おそらく最後の2つのうちの1つが必要でしょう。


1

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出力しないアドレスへ。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.