为什么这个命令在 AIX 上不起作用?

为什么这个命令在 AIX 上不起作用?

我想使用以下命令从文件中删除 UTF-8 BOM:

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

但这没有用。我在 AIX 7.1 上使用 ksh 运行

答案1

\x在 POSIX 中,基本正则表达式中的行为未指定。有些实现使用它来引入十六进制字节表示,有些实现(例如您的)将其视为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 来说iconvUTF-16意味着带有 BOM 的 UTF-16,而 UTF-16LE 意味着 UTF-16 小端,所以第二个iconv将剥离第一个生成的 UTF-16LE BOM(将也适用于 UTF-16BE)。

答案2

AIX sed 不理解转义序列字符,因为AIX sed 文档也就是说,它只识别 ASCII 字符。所以你应该使用其他工具。

尾巴

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

awk

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

答案3

这里同样的问题。需要从文件中删除 BOM (UTF-16LE)。最终使用“tr”和八进制代码表示 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

仍然无法发表评论 - 因此,如果您想尝试使用 GNU iconv - 作为更强大的解决方案,而不杀死依赖于 AIX 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

(64 位)依赖于 AIX iconv 的程序将查找 /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 iconvhttp://www.aixtools.net/index.php/libiconv并且可以与 AIX iconv 并列。

相关内容