Por que esse comando não funciona no AIX?

0

Eu quero remover o BOM UTF-8 de um arquivo usando este comando:

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

Mas não funcionou. Eu estou correndo com o ksh no AIX 7.1

    
por CaiNiaoCoder 31.07.2014 / 04:22

4 respostas

2

O AIX sed não entende caracteres de sequência de escape, como o O documento sed do AIX disse que só conhece caracteres ASCII. Então você deve usar outras ferramentas.

final

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

awk

awk '{NR==1{sub(/^\xef\xbb\xbf/,"")}1' old.java > tmp.java
    
por 31.07.2014 / 08:19
2

No POSIX, o comportamento não é especificado para \x em um regexp básico. Algumas implementações o utilizam para introduzir representações de byte hexadecimal, algumas (como a sua) tratam-no como x .

POSIXly, você poderia fazer:

(export LC_ALL=C
 sed "s/$(printf '737')//") < file.in > file.out

Aqui, você também pode ter alguma sorte com:

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

Não sei se isso funcionaria no AIX, mas com GNU iconv , UTF-16 significa UTF-16 com BOM, enquanto UTF-16LE significa UTF-16 little endian, portanto, o segundo iconv tira a BOM UTF-16LE produzida pela primeira (também funcionaria com UTF-16BE).

    
por 17.11.2016 / 15:36
0

O mesmo problema aqui. Necessário remover o BOM (UTF-16LE) de um arquivo. Acabou usando "tr" com códigos octal para o 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 "76"
"SET01"|"0000001"|"2016-11-15"|""|"0"|""|""|"Data01"
    
por 17.11.2016 / 15:18
0

ainda não pode comentar - então se você quiser tentar usar o GNU iconv - como uma solução mais robusta, sem matar os programas que dependem do AIX iconv, eu posso ter um pacote que funcionará para você.

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

(64 bits) Os programas, dependendo do ícone AIX, estarão procurando por /usr/lib/libiconv.a(shr4_64.o) (procure 32 bits por /usr/lib/libiconv.a(shr4.o)) enquanto aqueles, como o GNU iconv, olham para /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)

Você pode obter o GNU iconv para o AIX através do link e pode ficar lado a lado com o AIX iconv.

    
por 21.11.2016 / 19:47

Tags