유니코드 텍스트를 읽을 수 있는 형식으로 변환하려고 합니다. -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 쉘