이 명령이 AIX에서 작동하지 않는 이유는 무엇입니까?

이 명령이 AIX에서 작동하지 않는 이유는 무엇입니까?

다음을 사용하여 파일에서 UTF-8 BOM을 제거하고 싶습니다.

sed '1 s/\xEF\xBB\xBF//' old.java > tmp.java

그러나 그것은 작동하지 않았습니다. ksh를 사용하여 AIX 7.1에서 실행 중입니다.

답변1

\xPOSIX에서는 기본 정규식의 동작이 지정되지 않습니다. 일부 구현에서는 이를 사용하여 16진수 바이트 표현을 도입하고 일부 구현에서는 이를 x.

POSIXly에서는 다음과 같이 할 수 있습니다.

(export LC_ALL=C
 sed "s/$(printf '\357\273\277')//") < file.in > file.out

여기서도 행운을 누릴 수도 있습니다.

< file.in iconv -t UTF-16LE | iconv -f UTF-16 > file.out

이것이 AIX에서 작동하는지 말할 수는 없지만 GNU의 경우 BOM이 있는 UTF-16을 iconv의미하고 UTF-16UTF-16LE는 UTF-16 리틀 엔디안을 의미하므로 두 번째는 iconv첫 번째 -16LE BOM에서 생성된 UTF를 제거합니다( UTF-16BE에서도 작동합니다).

답변2

AIX sed는 이스케이프 시퀀스 문자를 이해하지 못합니다.AIX sed 문서즉, ASCII 문자만 인식합니다. 따라서 다른 도구를 사용해야 합니다.

꼬리

tail -c +4 old.java > tmp.java

awk '{NR==1{sub(/^\xef\xbb\xbf/,"")}1' old.java > tmp.java

답변3

여기서도 같은 문제가 발생합니다. BOM(UTF-16LE)을 파일에서 제거해야 합니다. 마지막으로 "tr"과 8진수 코드를 사용하여 0xFF 0xFE를 나타냅니다.

$ cat old.csv
ÿþ"SET01"|"0000001"|"2016-11-15"|""|"0"|""|""|"Data01"

$ echo "ibase=16\nobae=8\nFF" | bc
377
$ echo "ibase=16\nobae=8\nFE" | bc
376

$ cat old.csv | tr -d "\377\376"
"SET01"|"0000001"|"2016-11-15"|""|"0"|""|""|"Data01"

답변4

여전히 의견을 제시할 수 없습니다. 따라서 AIX iconv에 의존하는 프로그램을 종료하지 않고 보다 강력한 솔루션으로 GNU iconv를 사용하고 싶다면 패키지를 제공해 드릴 수 있습니다.

michael@x071:[/home/michael]ar -X64 tv /usr/lib/libiconv.a
rwxr-xr-x     0/0     1032868 Aug 21 16:19 2016 libiconv.so.2
r--r--r--     0/0     159410 Aug 21 20:09 2016 shr4_64.o

michael@x071:[/home/michael]ar -X32 tv /usr/lib/libiconv.a
rwxr-xr-x     0/0     1010856 Aug 21 16:21 2016 libiconv.so.2
r--r--r--     0/0     117276 Aug 21 20:09 2016 shr4.o
r--r--r--     0/0     117526 Aug 21 20:09 2016 shr.o

AIX iconv에 의존하는 (64비트) 프로그램은 /usr/lib/libiconv.a(shr4_64.o)를 찾습니다(32비트는 /usr/lib/libiconv.a(shr4.o)를 찾습니다). , GNU iconv와 같은 /usr/lib/libiconv.a(libiconv.so.2)를 확인하세요.

michael@x071:[/home/michael]ldd /usr/bin/iconv
/usr/bin/iconv needs:
         /usr/lib/libc.a(shr.o)
         /usr/lib/libiconv.a(shr4.o)
         /unix
         /usr/lib/libcrypt.a(shr.o)

michael@x071:[/home/michael]ldd /opt/bin/iconv
/opt/bin/iconv needs:
         /usr/lib/libc.a(shr_64.o)
         /usr/lib/libiconv.a(libiconv.so.2)
         /unix
         /usr/lib/libcrypt.a(shr_64.o)

다음을 통해 AIX용 GNU iconv를 얻을 수 있습니다.http://www.aixtools.net/index.php/libiconv그리고 AIX iconv와 연결될 수 있습니다.

관련 정보