長い文字列。空白で区切られた単語を含み、そのうちの1文字は$ somevarで終わります。 シンプルなバージョンは、(xは$ SOMEVARがある)である:expr文字列を使用しています:文字列を切り詰める正規表現
expr "abc aac bbcx" : '.*\([^ ]\+x\).*'
問題があり、それが唯一の "CX" を返します。それは "bbcx"を返します。ここで何が間違っていますか?
長い文字列。空白で区切られた単語を含み、そのうちの1文字は$ somevarで終わります。 シンプルなバージョンは、(xは$ SOMEVARがある)である:expr文字列を使用しています:文字列を切り詰める正規表現
expr "abc aac bbcx" : '.*\([^ ]\+x\).*'
問題があり、それが唯一の "CX" を返します。それは "bbcx"を返します。ここで何が間違っていますか?
を*は貪欲である - それは、できるだけ多くの文字に一致します。 。*に変更します。
.*?([^ ]+x).*?
は、次の正規表現試すことができます:[^\s]+x\b
kent$ echo "abc aac bbcx"|grep -Po "[^\s]+(?=x)"
bbc
は 'X' あまりにもあなたが必要な場合:あなたはそれらの
とを終了言及し、それができる限り少数を一致させるために1は$ SOMEVAR
kent$ echo "abc aac bbcx"|grep -Po "[^\s]+x(?=\s|$)"
bbcx
kent$ echo "abc aacx bbc"|grep -Po "[^\s]+x(?=\s|$)"
aacx
私は私の友人をフォローしていません。 。* \([^] \ + x \)。*は入力文字列と一致しません。 – FailedDev
@FailedDev私は '+'メタキャラクターが使えないことを覚えている限り、 "廃止RE"や基本RE(BSDとDarwin/MacOSは私が知っている2つのシステム)を使っているシステムでは、 '{1、}'や '\ {1、\}'のようなものを試してみて、 're_format(7)'のマニュアルページを確認してください。 – sidyll
@Łukasz、これは、発生した最初のアトム( '。*')がすべて一致するためです。そして、正規表現を続けることはできないので、式を満たすために '[^]'のマッチまでバックトラックし、そこからマッチを続けます。それは有効ですが、あなたが本当に望んでいるのは、冒頭の貪欲でない原子です。しかし、それを行う方法はわかりません。これは、一般に、OSと一連のツールに大きく依存します。 GNU/Linuxを使用していますか? (ちょうどアバターによって推測:-) – sidyll