Grep

如何在文件中查找字元串的字元位置?

  • July 24, 2019

我需要在具有特定編碼(通常為 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。)

引用自:https://unix.stackexchange.com/questions/531424