xargs가 유니코드 리터럴을 처리하는 방법을 이해할 수 없습니다.

xargs가 유니코드 리터럴을 처리하는 방법을 이해할 수 없습니다.

유니코드 텍스트를 읽을 수 있는 형식으로 변환하려고 합니다. -t 플래그를 사용하여 실행하기 전에 xargs가 어떤 명령을 실행할지 확인합니다. 나는 다음과 같은 이상한 점을 발견했습니다.

$ echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
echo -e "\t\u0042\u0065\u006e"
"       \u0042\u0065\u006e"

그러나 수동으로 실행하면 다음과 같습니다.

$ echo -e "\t\u0042\u0065\u006e"
        Ben
$

\t이는 두 예제 모두에서 올바르게 처리됩니다. 그러나 \u00XX첫 번째 예에서는 값이 일반 문자열로 처리되지만 두 번째 예에서는 올바르게 인코딩됩니다. 나는 또한 그것을 사용할 때 printf똑같은 이상한 행동을 봅니다 .


$echo -n "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' printf \"{}\"
printf "\t\u0042\u0065\u006e"
"       printf: invalid universal character name \u0042
$ printf "\t\u0042\u0065\u006e"
        Ben

무슨 일이 일어나고 있고 어떻게 해결하는지에 대한 아이디어가 있나요?

답변1

Dave의 말이 맞습니다. 관련된 쉘이 없으므로 에코는 /bin/echo입니다. 다음을 시도하십시오.


echo  "\\\t\\\u0042\\\u0065\\\u006e" | od -c

echo "\\\t\\\u0042\\\u0065\\\u006e" | xargs -t -I '{}' echo -e '"'{}'"'
 
# echo -e '"'\t\u0042\u0065\u006e'"'
/bin/echo -e '"'\\t\\u0042\\u0065\\u006e'"'

결과:

0000000   \   \   t   \   \   u   0   0   4   2   \   \   u   0   0   6
0000020   5   \   \   u   0   0   6   e  \n
0000031
"   \u0042\u0065\u006e"
"   \u0042\u0065\u006e"
echo -e "\t\u0042\u0065\u006e" 

시험을 마친온라인 bash 쉘

관련 정보