개행 문자로 \n을 포함하는 표준 출력 표시

개행 문자로 \n을 포함하는 표준 출력 표시

실행 파일(cURL)의 출력에는 \n이 포함됩니다. 이러한 출력을 개행 문자로 어떻게 표시할 수 있습니까?

실행 파일의 출력이 이라고 가정하면 tCL\n1523 memo\nprintf에 대한 파이핑은 개행을 표시하지 않습니다.

$ 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

관련 정보