印刷できない文字、改行、またはタブを含む文字列がある場合は、文字列を印刷してecho
その文字のコード(改行、\n
バック\b
スペースなど)を表示する方法はありますか?
答え1
からスイッチを削除し-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
こともできます。ksh93
zsh
bash
$ printf "%q\n" "$(echo -e "hi\t\tbye\n\nbye")"
$'hi\t\tbye\n\nbye'
(bash
出力は上に表示されます。シェルによっては多少のバリエーションがある場合があります。)
help printf
存在するbash
%q
シェル入力で再利用できる方法で引数を引用
答え2
これを行う方法はいくつかあります。私が知る限り、最も移植性の高い2つはsed
POSIXod
です。
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