ファイル内の文字列の文字位置を見つけるには?

ファイル内の文字列の文字位置を見つけるには?

特定のエンコーディング(通常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

ベストアンサー1

現在のバージョンの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として処理するように強制することはできないようです)。

おすすめ記事