0

exの1つ以上の出現に一致させたいです。exprを使用した何とかの。

これは機能します。

$ expr "blahblahblah" : 'blahblah'
8

この正規表現の何が問題になっていますか?

$ expr "blahblahblah" : '\(blah\)\+'
blah

一致する文字数が欲しい。

4

3 に答える 3

3

あなたの質問はタグ付けされているのでbash、最新バージョンのシェルには expr よりも優れた機能があり、まさにあなたが望むことを行います:

$ re='(blah)+'
$ [[ foo_blahblah_bar =~ $re ]] && echo "${#BASH_REMATCH[0]}"
8
于 2012-07-23T16:44:47.893 に答える
1

まず、\(\)代わりに()との\+代わりに が必要です+。しかし、それだけではありません。

グループ()を使用して、一致した文字列の長さを同時に取得することはできません。

パターン一致は、( と ) または null の間で一致した文字列を返します。( および ) が使用されていない場合、一致した文字数または 0 が返されます。

wc文字列の長さを取得するには、次を使用する必要があります。

$ expr "blahblahblahblah" : '\(\(blah\)\+\)' | wc -c
17

または、パラメーター展開を使用します。

$ m=$(expr "blahblahblahblah" : '\(\(blah\)\+\)') 
$ echo ${#m}
16

( wc -c は行末もカウントするため、違いがあります)。

しかし、グループなしで正規表現を書くことができれば、長さが得られます:

$ expr "blahhhhhbl" : "blah\+"
8
于 2012-07-23T16:44:40.143 に答える
0

sed を使用:

echo "blahblahblah" | sed -n 's!\(\(blah\)*\).*!\1!p' | wc -c
于 2012-07-23T16:52:48.130 に答える