Linuxでコマンドラインを使用してphp / pregからいくつかのキャプチャグループを抽出するには?

Linuxでコマンドラインを使用してphp / pregからいくつかのキャプチャグループを抽出するには?

Linux環境で文字列を操作するための多くのパッケージ(grep、awk、sed ...)があることを考慮すると、php / pregと同様の構文でキャプチャグループを抽出するソフトウェアが必要です。

おそらく最も近いかもしれませんが、grep -Pそれがどのように機能するのか理解していません。

このようなことは、cat file.txt | grep -P '/something="([\w]+)"/i'キャプチャグループ内にあるもの以上を提供するようです。

誰かが私にいくつかの実際のケースを提供できますか?私をサポートし、いくつかのバリエーションと制限事項を説明してください!

編集:どこかでこれを達成するために使用されているのを見ましたが、sedそれでも構文について少し混乱しています。

ベストアンサー1

pcregrep -io1 'something="(\w+)"' myfile.txt

-i大文字と小文字を区別しない一致の場合、-o1最初のキャプチャグループが印刷されます。)

GNUgrepサポート-P(perl互換正規表現サポートで構築されている場合)と-o-oただし、Perlツアー演算子を使用してこの問題を解決できます。

grep -iPo '(?<=something=")\w+(?=")' myfile.txt

(つまり、シーケンスに一致する正規表現文字を形成する単語ただし、後ろに)something="が従う必要があります"

または、最も近いPCREを使用してください。

grep -iPo 'something="\K\w+(?=")' myfile.txt

\Kリセットマッチひも)。

ただし、Perl正規表現を使用するには、次のものを使用することもできますperl

perl -C -lne 'print for /something="(\w+)"/ig' myfile.txt

GNUまたはBSDを使用すると、sed各行の一番右の一致のみが返されます。

sed -nE 's/.*something="(\w+)".*/\1/pi' myfile.txt

移植可能(拡張正規表現サポートと大文字と小文字を区別しない一致は非標準拡張であり、すべての実装sedでサポートされていないため):

sed -n 's/.*[sS][oO][mM][eE][tT][hH][iI][nN][gG]="\([[:alnum:]_]\{1,\}\)".*/\1/p' myfile.txt

大文字が仮定iされますI。これは、たとえば大文字のロケールでは、動作が以前のソリューションとは異なることを意味しiますİ

連続してすべてのアイテムを見つけるための標準/携帯用ソリューション:

awk '{while(match(tolower($0), /something="[[:alnum:]_]+"/)) {
    print substr($0, RSTART+11, RLENGTH-12)
    $0 = substr($0, RSTART+RLENGTH-1)}}' myfile.txt

入力に長さ(文字数)の異なる小文字バージョンのテキストが含まれていると、正しく機能しない可能性があります。

罠:

  • \w[[:alnum:]_]C / POSIX以外のロケールでの一致に関して、これらすべてのソリューション間にはいくつかの違いがあります。いずれにせよ、少なくとも下線、すべての10進数のアラビア数字、ラテン英語のアルファベット(大文字と小文字)を含める必要があります。これが必要な場合は、ロケールをCに変更してください。
  • 上記のように、大文字と小文字を区別しない一致は、ロケールによって大きく異なります。a-z対英語文字にのみ興味がある場合は、A-ZロケールをCに変更してください。
  • .少なくとも GNU 実装では、正規表現演算子はsed有効な文字ではないバイト列と一致しません。たとえば、UTF-8 ロケールでは、ビット 8 がセットされたシングルバイト文字セットの文字と一致しないことを意味します。つまり、sedソリューションが正しく機能するためには、入力ファイルで使用される文字セットがユーザーロケールの文字セットと同じである必要があります。
  • perlpcregrepGNUユーティリティは通常、ランダムな長さとランダムなバイト値を含む行を処理しますが(上記の警告に注意)、最後の改行文字の後の追加データを追加の行として処理します。これらのユーティリティの他の実装はそうではないかもしれません。
  • 上記のパターンは、入力の各行を順番に一致させます。これは、複数の入力行と一致できないことを意味します。 2行以上に渡ることができないこのようなパターンでは問題になりませんが、something="\w+"一般的には、パターンが複数行にまたがる可能性のあるテキストと一致するようにするには、something=".*?"次のものが必要です。

    • 処理するレコードの種類を変更します。grep --nullsed -zsedGNUのみ)、、perl -0awk -v RS='\0'GNUawkおよび最新バージョンのみmawk)行の代わりにNUL区切りレコードを処理できます(改行区切りレコード)。 GNUはawk正規表現をレコード区切り文字として使用できます(-v RS='regexp'),perl any byte value (with-0ooo`を使用)。
    • pcregrep複数行モードがあります-M
    • perlフル入力がレコードであるフルルックモードを使用(使用-0777

    その後、perlとpcreの場合、.フラグが有効になっていないと改行は一致しませんs。たとえば、pcregrep -Mio1 '(?s)something="(.*?)"'またはperl -C -l -0777 -ne 'print for /something="(.*?)"/gis'

  • grepとの一部のバージョンには、またはバグがpcregrepあり、正規表現エンジンには通常、正規表現のマッチングに入れることができるワークロードにデフォルトの制限があります。-z-M

おすすめ記事