echo -e 的反义词是什么?

echo -e 的反义词是什么?

如果我有一个包含不可打印字符、换行符或制表符的字符串,是否可以使用某种方法echo来打印该字符串并显示这些字符的代码(例如,\n换行符、\b退格符)?

答案1

当您删除、 in 的-e开关并且尚未启用该选项时,它应该将字符串打印为原始文本。所以and会按字面意思显示。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输出如上所示。根据 shell 的不同,会有一些变化)。

摘自help printfbash

%q 以可重复用作 shell 输入的方式引用参数

答案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命名字符。上面使用的选项-w不是 POSIX 指定的。

这里有一个小 shell 函数,它将可移植地打印出其参数中每个字节的八进制值 - 当然,它od也可以处理-t o

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

这很简单。这有点复杂。不过,它应该能够完成特定于 shell 的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输出地址。

相关内容