このコマンドが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リトルエンディアンを意味するため、2番目は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に関連付けることができます。

関連情報