Учитывая следующие два файла, созданные с помощью следующих команд:
$ 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 форматирования файла журнала.