將 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/
字串之前