인쇄할 수 없는 문자, 줄 바꿈 또는 탭이 포함된 문자열이 있는 경우 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
이를 수행하는 방법에는 여러 가지가 있습니다. 내가 아는 한, 가장 이식성이 좋은 두 가지는 sed
POSIX 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