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/


回避策の 1 つsedは、文字列がどこに出現するかがわかっている場合です。例:

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

ここでは、行の先頭から、1セットの/text/文字列が先行します

関連情報