sed 正規表示式模式匹配貪婪,儘管它不應該

sed 正規表示式模式匹配貪婪,儘管它不應該

我偶然發現了一種我無法解釋的行為,希望你們中的一些人可以幫助我。

我嘗試從一個更大的專案中生成某種文檔Ant,因此我用它sed來過濾文件中的信息,以便稍後在文檔中使用。

我有一個普通的 ant 建置文件,其中包含如下行:

    <target name="targetA" depends="targetD" description="some fancy description">
...
    <target name="targetB" depends="targetD" description="some fancy description">
...
    <target name="targetC" depends="targetD" description="some fancy description">

現在我沿著這條 sed 行運行:

sed -nr 's/.*?target name="(.*?)".*="(.*?)".*/ * \1 - \2/p'

它應該給我:

 * targetA - some fancy description
 * targetB - some fancy description
 * targetC - some fancy description

相反,我得到:

 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description
 * targetA" depends="targetD" - some fancy description

我嘗試跳過第二組的輸出,以驗證它是第一組實際上與整個“依賴”部分匹配的組,儘管我將正則表達式設置為非貪婪直到下一個雙引號。

我在這裡缺少什麼?

使用像這樣更明確的正規表示式可以按預期工作,但我仍然沒有得到貪婪的東西:

sed -nr 's/.*?target name="(.*?)".*=.*="(.*?)".*/ * \1 - \2/p'

因為這可能很有趣,我在 ubuntu linux 上使用 sed-4.2.2-4ubuntu1 (預設安裝)

答案1

Sed 不支援非貪婪匹配,如“.*?”所示。表達。

嘗試這個:

sed -nr 's/.*target name="([^"]*)" .*="(.*)".*/ * \1 - \2/p' file

輸出:

* targetA - 一些奇特的描述
 * targetB - 一些奇特的描述
 * targetC - 一些奇特的描述

相關內容