exの1つ以上の出現に一致させたいです。exprを使用した何とかの。
これは機能します。
$ expr "blahblahblah" : 'blahblah'
8
この正規表現の何が問題になっていますか?
$ expr "blahblahblah" : '\(blah\)\+'
blah
一致する文字数が欲しい。
あなたの質問はタグ付けされているのでbash
、最新バージョンのシェルには expr よりも優れた機能があり、まさにあなたが望むことを行います:
$ re='(blah)+'
$ [[ foo_blahblah_bar =~ $re ]] && echo "${#BASH_REMATCH[0]}"
8
まず、\(\)
代わりに()
との\+
代わりに が必要です+
。しかし、それだけではありません。
グループ()
を使用して、一致した文字列の長さを同時に取得することはできません。
パターン一致は、( と ) または null の間で一致した文字列を返します。( および ) が使用されていない場合、一致した文字数または 0 が返されます。
wc
文字列の長さを取得するには、次を使用する必要があります。
$ expr "blahblahblahblah" : '\(\(blah\)\+\)' | wc -c
17
または、パラメーター展開を使用します。
$ m=$(expr "blahblahblahblah" : '\(\(blah\)\+\)')
$ echo ${#m}
16
( wc -c は行末もカウントするため、違いがあります)。
しかし、グループなしで正規表現を書くことができれば、長さが得られます:
$ expr "blahhhhhbl" : "blah\+"
8
sed を使用:
echo "blahblahblah" | sed -n 's!\(\(blah\)*\).*!\1!p' | wc -c