次の正規表現で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/
ここでは、行の先頭からグループが/text/
文字列の前に続きます。