使用 sed 僅取代第一次出現的模式

使用 sed 僅取代第一次出現的模式

將 sed 與此正規表示式一起使用:

message=$(echo "$path" | sed -E 's/(.+pattern[0-9][0-9]*).+/\1/')

使用這個表達式,像這樣的行:

/lol/pattern03657/qsd/qsd/pattern0001/qsd/

將被替換為:

/lol/pattern03657/qsd/qsd/pattern0001

而我希望它們是:

/lol/pattern03657/

我認為 sed 只會替換第一個出現的地方,但它似乎沒有這樣做。我必須更改什麼才能使我的程式碼以這種方式運行?

答案1

那是因為*,+是貪婪量詞,會盡量多匹配

$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | sed -E 's/(.+pattern[0-9][0-9]*).+/\1/'
/lol/pattern03657/qsd/qsd/pattern0001

perl?透過添加到具有非貪婪量詞+

$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | perl -pe 's/(.+?pattern\d+\/).+/\1/'
/lol/pattern03657/

grep或與pcre選項一起使用(如果可用)

$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | grep -oP '^.+?pattern\d+/'
/lol/pattern03657/


一種解決方法sed是如果您知道字串出現的位置。例如:

$ echo '/lol/pattern03657/qsd/qsd/pattern0001/qsd/' | sed -E 's|^(/[^/]+/pattern[0-9][0-9]*/).+|\1|'
/lol/pattern03657/

這裡,從行的開頭開始,一組位於/text/字串之前

相關內容