실행 파일(cURL)의 출력에는 \n이 포함됩니다. 이러한 출력을 개행 문자로 어떻게 표시할 수 있습니까?
실행 파일의 출력이 이라고 가정하면 tCL\n1523 memo\n
printf에 대한 파이핑은 개행을 표시하지 않습니다.
$ echo "tCL\n1523 memo\n"
tCL\n1523 memo\n
$
$ printf "tCL\n1523 memo\n"
tCL
1523 memo
$
$ echo "tCL\n1523 memo\n" | xargs -0 printf '%s'
tCL\n1523 memo\n
$
$ echo "tCL\n1523 memo\n" | awk '{ printf "%s", $0 }
tCL\n1523 memo\n
답변1
%s
이스케이프 시퀀스는 해석되지 않습니다. 다음이 필요합니다 %b
.
% echo 'tCL\n1523 memo\n' | xargs -0 printf "%b"
tCL
1523 memo
%
답변2
이중 백슬래시를 백슬래시로 변환해야 할 수도 있습니다. 그렇지 않으면 입력 형식이 모호해집니다.
백슬래시 문자 이스케이프를 번역하는 sed 스크립트를 작성할 수 있습니다. 스크립트는 인식된 이스케이프 시퀀스만 변환하며, 그렇지 않으면 백슬래시가 제거됩니다. 나는 이미 줄바꿈과 탭을 지원합니다.
… | sed 's/\\n/\n/g; s/\\t/ /; s/\\\(.\)/\1/g'
공백은 s/\\t/ /
탭 문자입니다. GNU sed를 사용하면 s/\\t/\t/
.
8진수 이스케이프도 필요한 경우 Perl과 같은 고급 도구를 사용하세요. 지원하는 모든 이스케이프 시퀀스를 구문 분석하도록 할 수 있습니다.
… | perl -pe 's/\\([0-7]{1,3}|c.|[oxN]\{[^{}]+\}|.)/"\"\\${1}\""/eeg'
답변3
awk로 하고 싶은 일을 하기 위해 필요한 것은 다음과 같습니다. 다음 입력이 주어지면:
$ printf '%s\n' 'abc\\ndef\nghi'
abc\\ndef\nghi
첫 번째 항목 자체는 \n
이스케이프 처리되므로 문자 그대로 처리해야 합니다 \\n
. 예상되는 출력을 얻는 방법은 다음과 같습니다.
$ printf '%s\n' 'abc\\ndef\nghi' |
awk '{gsub(/@/,"@A"); gsub(/\\\\/,"@B"); gsub(/\\n/,"\n"); gsub(/@B/,"\\\\"); gsub(/@A/,"@")}1'
abc\\ndef
ghi
예를 들어 다른 이스케이프 시퀀스도 해석하려면 for \t
각 이스케이프 시퀀스 뒤에 별도의 gsub()를 추가할 수 있습니다 \n
. 예를 들면 다음과 같습니다.
awk '{
gsub(/@/,"@A"); gsub(/\\\\/,"@B")
gsub(/\\n/,"\n")
gsub(/\\t/,"\t")
gsub(/@B/,"\\\\"); gsub(/@A/,"@")
}1'
처음 2개와 마지막 2개 gsub()는 고유한 문자열을 생성하여 영향을 받지 않도록 @B
매핑한 다음 예상 변환이 완료된 후 다시 매핑합니다.\\
답변4
충분히 간단합니다. echo -e "tCL\n1523 memo\n"
에서 man echo
:
-e enable interpretation of backslash escapes