grepを使って動作するPerl正規表現があります。私はそれがどのように機能するかを理解しようとしています。
以下はコマンドコマンドです。
grep -oP '(?<=location>)[^<]+' testFile1.xml
以下は内容ですtestFile1.xml
<con:location>C:/test/file1.txt</con:location></con:dataFile>/con:dataFiles></con:groupFile>
これが結果です
C:/test/file1.txt
正規表現を理解しようとしています。つまり、(?<=location>)[^<]+
ベストアンサー1
(?<=...)
は後ろを見てPCRE演算子。それ自体は何も一致しませんが、むしろ条件として機能します(左側にあるものは何でも一致します...
)。
(?<=X)Y
一致Y
の前提は、左側の内容が一致することですX
。 inはblahYfooXYbar
2番目のものと一致し、Y
一致するX
項目の一部ではありません。それ自体(?<=X)
は幅がゼロのようです(想像)その直前ですY
。例は次のとおりです。
$ echo X-RAY THE FOX | perl -lpe 's/(?<=X)/<there>/g'
X<there>-RAY THE FOX<there>
使用時は-o
印刷grep
のみするのでマッチセクションに何かを印刷する方法は1つあります。後ろに(location>
ここで一致するのは、[^>]+
1つ以上の(+
)<
文字ではなく()なので、次の文字または行末(空でない場合)[^>]
までのすべてです。<
もう1つの方法は、\K
(最新バージョンのPCREで)以下を使用して、一致する部分の開始をリセットすることです。
grep -Po 'location>\K[^>]+'
-P
とは-o
GNU拡張です。pcregrep
最新バージョン(8.11以降)(他のPCRE実装を使用)の場合は、grep
次のこともできます。
pcregrep -o1 'location>([^>]+)'
(最初に-o1
キャプチャした内容を印刷します(ここでは1つのみ))(...)