Grep
如何在文件中查找字元串的字元位置?
我需要在具有特定編碼(通常為 utf8)的文件中搜尋字元串(字元序列),但返回結果的字元偏移量(不是字節偏移量)。
所以這是一個應該獨立於字元串/文件編碼的搜尋。
grep
顯然不能這樣做,所以我應該使用哪個工具?範例(正確):
$ export LANG="en_US.UTF-8" $ echo 'aöæaæaæa' | tool -utf8 'æa' 2 4 6
範例(錯誤):
$ export LANG="en_US.UTF-8" $ echo 'aöæaæaæa' | tool 'æa' 3 6 9
在目前版本的 Perl 中,您可以使用
@-
和@+
魔法數組來獲取整個正則表達式和任何可能的擷取組的匹配位置。兩個數組的第零個元素保存與整個子字元串相關的索引,$-[0]
您感興趣的也是。作為一個單行:
$ echo 'aöæaæaæa' | perl -CSDLA -ne 'BEGIN { $pattern = shift }; printf "%d\n", $-[0] while $_ =~ m/$pattern/g;' æa 2 4 6
或完整的腳本:
#!/usr/bin/perl use strict; use warnings; use utf8; use Encode; use open ":encoding(utf8)"; undef $/; my $pattern = decode_utf8(shift); binmode STDIN, ":utf8"; while (<STDIN>) { printf "%d\n", $-[0] while $_ =~ m/$pattern/g; }
例如
$ echo 'aöæaæaæa' | perl match.pl æa - 2 4 6
(後一個腳本僅適用於標準輸入。我似乎很難強制 Perl 將所有文件都視為 UTF-8。)