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

이를 수행하는 방법에는 여러 가지가 있습니다. 내가 아는 한, 가장 이식성이 좋은 두 가지는 sedPOSIX od입니다.

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라는 두 가지 유형의 이스케이프를 원한다고 지정했습니다 . 위에 사용된 옵션은 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

관련 정보