この正規表現で 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/
文字列が先行します