给定以下命令创建的以下两个文件:
$ printf "foo\nbar\nbaz\n" | iconv -t UTF-8 > utf-8.txt
$ printf "foo\nbar\nbaz\n" | iconv -t UTF-16 > utf-16.txt
$ file utf-8.txt utf-16.txt
utf-8.txt: ASCII text
utf-16.txt: Little-endian UTF-16 Unicode text
我想在 UTF-16 格式的文件中找到匹配的模式,就像在 UTF-8 中使用 Ruby 一样。
这是 UTF-8 文件的工作示例:
$ ruby -e 'puts File.open("utf-8.txt").readlines.grep(/foo/)'
foo
但是,它不适用于 UTF-16LE 格式的文件:
$ ruby -e 'puts File.open("utf-16.txt").readlines.grep(/foo/)'
Traceback (most recent call last):
3: from -e:1:in `<main>'
2: from -e:1:in `grep'
1: from -e:1:in `each'
-e:1:in `===': invalid byte sequence in US-ASCII (ArgumentError)
我尝试通过以下方式转换基于此帖子的文件:
$ ruby -e 'puts File.open("utf-16.txt", "r").read.force_encoding("ISO-8859-1").encode("utf-8", replace: nil)'
ÿþfoo
bar
baz
但它ÿþ
之前打印了一些无效字符()foo
,其次我不知道grep
转换后如何使用方法(它报告为未定义的方法)。
如何使用readlines.grep()
UTF-16 文件的方法?或者其他一些简单的方法,我的目标是使用特定的正则表达式模式打印行。
理想情况下在一行中,因此该命令可用于 CI 测试。
这是一些真实世界的场景:
ruby -e 'if File.readlines("utf-16.log").grep(/[1-9] error/) {exit 1}; end'
但由于日志文件的 UTF-16 格式,该命令不起作用。