我想使用以下命令从文件中删除 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 来说iconv
,UTF-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 并列。