複数の行でグループを2回一致させようとしています。
grep -Pz 'Source: (?<group>.*/).*\n.*\n.*\n.*\k<group>|$'
1つの主な問題を除いて動作します。つまり、グループ一致の最初の発生と同じ文字を\k<group>
検索せずに検索しません。これは、逆参照が動的であることを考慮すると、正常な現象です。.*/
「静的」逆参照を取得できますか?つまり、(?<test>\d\d)
45が一致した場合、グループテストの次の呼び出しはいつも45をお探しですか?
私は英語で技術的な用語をうまく説明できないので、私に声を上げるか、より具体的に言うようにしてください。
(私はここでPerl grepを使用していますが、それを使用しない解決策がある場合は続行してください)
編集する:
以下のコメントに答えるには:1:ex ifデータに基づいて多数の画像ファイルを一括移動するスクリプトがあります。完全に動作しますが、場合によってはソースディレクトリが出力ディレクトリと同じかどうかをテストしたいと思います。
作業例:
[1/1] (TEST - no files are being moved/copied)
Source: /disk/media/Camera/IMG_20130611_183722.jpg
Date/Time: 2013-06-11 16:37:23
Corresponding Tags: Composite:GPSDateTime
Destination (move): ./2013/06-Jun/20130611_163723.IMG_20130611_183722.jpg
ここの入力と出力は同じではないので、スクリプトが何も検出しないことを望みますが、
Source: /disk/media/Camera/IMG_20130611_183722.jpg
移動
Destination (move): /disk/media/Camera/20130611_163723.IMG_20130611_183722.jpg
私はこの4行を強調したいと思います。目的は、他の目的でデータを取得するのではなく、検出されたファイルをすばやく視覚的に識別することです。
正規表現を使用すると、グループの2番目の発生が動的であるため常に強調表示されます(2つが同じではないことをgrepすることは重要ではありません)。
答え1
わかりました、わかりそうです。正規表現は、グループの先頭から最後の行以降まですべてをSource: (?<group>.*/).*\n
キャプチャします。group
たとえば、JPEG画像ファイル名をキャプチャするには、キャプチャが必要です。Source:
/
/disk/media/Camera/
Source: .*/(?<group>.*)\n…
さて、またやりましょう。私はあなたを信頼しますはい希望の静的逆参照を取得します。問題は、あなたが得ると思う逆参照を得ることができないということです。あなたのキャプチャグループ(およびその後の逆参照)はただ/
。.*
.*/
最初 /
。たぶんこれは?
ある意味解釈されます。
私の考えであなたが望むもの
Source: (?<group>.*/)[^/]*\n…
これは強制.*/
的に通過します。最後 /
。