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/

ここでは、行の先頭からグループが/text/文字列の前に続きます。

おすすめ記事