echo -e의 반대 방향은 무엇입니까?


13

인쇄 할 수없는 문자, 줄 바꿈 또는 탭 echo이있는 문자열이있는 경우이 문자열을 인쇄하고 이러한 문자 (예 : \n새 줄, \b백 스페이스)의 코드를 표시 하는 데 사용할 수있는 방법 이 있습니까?


2
printf 명령을 사용할 수 있습니다. man printf
PersianGulf를

12
e- ohce* rimshot *
David Richerby

3
printf '%q' "$str"이스케이프 된 문자열을 인쇄합니다. 나는 이것을 사용하는 것과 동일한 형식의 탈출 방식이 아니기 때문에 대답으로 추가하지 않습니다. echo -e(1) 안전합니다. (1) 목표가 인간의 가독성이라면 (2) 그것은 충분합니다. 목표가 안전한 쉘 생성이고 (3) echo -eEvil And Wrong 인 경우에 충분합니다 ( POSIX 사양을 읽으면 printf가 문자열 형식을 지정하는 선호되는 방법임을 알 수 있습니다 echo -e. 모두).
Charles Duffy

답변:


7

이를 수행하는 많은 방법이 있습니다. 내가 알고있는 대부분의 휴대용 둘은 sed그리고 od그들은 모두 POSIX이야 -.

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

그것은 같은 ... 않는 readC 스타일 - 스타일의 탈출을.

산출

$
\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 지정하지 않습니다.

그리고 여기에 인수로 각 바이트의 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 여전히 1 바이트 문자 만 수행하지만 지금은 망칠 가능성이 적습니다.
mikeserv

1
10k 표시로 안내합니다 :)
Ramesh

우우 !!!!!!!!!
slm

@ slm-추측하자 .. 당신은 정말 좋아 proctal?
mikeserv

@ StéphaneChazelas-당신은 어떤 생각을 가지고 bsq()있습니까-아무것도 빠졌습니까? 나는 백 슬래시에 대해 완전히 확신하지 못하기 때문에 묻습니다.
mikeserv

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의 내장 명령을 ksh93, zshbash뿐만 아니라이 변통 할 수 있습니다.

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

( bash위의 출력. 쉘에 따라 약간의 차이가 있습니다).

발췌에서help printfbash

%q 쉘 입력으로 재사용 할 수있는 방식으로 인수를 인용하십시오


1
그것은 printf %q후행을 자르는 것이 아니며 \n, $()그것들을 제거 하는 출력 캡처입니다.
ecatmur

@ ecatmur-고맙습니다. 늦은 밤에 썼고 더 이상 디버깅하려고 시도하지 않았습니다. 당신은 맞을 것입니다, 그것들을 벗겨내는 것이 서브 쉘입니다. 이유는 다음과 같습니다. unix.stackexchange.com/questions/17747/…
slm

어쨌든 printf서브 쉘 내부 에서 실행 하여 출력을 캡처하는 것은 어리석은 일 입니다. 서브 쉘을 포함하지 않고 직접printf -v varname 출력을 변수에 넣을 것이기 때문 입니다 .
Charles Duffy

@CharlesDuffy-나는 당신을 따르지 않고, 나는 printf서브 쉘에서 달리지 않고, 나는 echo하나에서 달리고 있었다 . 순수하게 당신은 특수 문자 출력을 가져 와서 echo이스케이프 된 표기법으로 다시 변환 할 수 있음을 보여주기 위해 .
slm

@slm, 그것은 지금 찾은 코드가 아니라 첫 번째 주석 (첫 번째 주석이 응답 한 코드)에 대한 응답이었습니다. 이전 편집 상태에 대해 부정확 한 것을 유추 한 경우 사과드립니다.
Charles Duffy

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 고양이의 구현, 예를 들면 맥 OS / 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'

귀하의 경우에는 아마도 마지막 두 가지 중 하나를 원할 것입니다.


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없는 출력 주소를합니다.


-1

printf명령을 사용하십시오 . 예를 들면 다음과 같습니다.

printf "Hello\nthis is my line

출력합니다

Hello
this is my line

1
이것 같습니다 echo -e. 나는 그 반대를 찾고 있습니다.
drs

구체적인 예를 들어 주시겠습니까?
Lazuardi N Putra
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.