16

bashで複数行のマッチングを行いたい=~

#!/bin/bash
str='foo = 1 2 3
bar = what about 42?
boo = more words
'
re='bar = (.*)'
if [[ "$str" =~ $re ]]; then
        echo "${BASH_REMATCH[1]}"
else
        echo no match
fi

ほぼそこにありますが、^またはを使用$すると一致せず、使用しない場合.は改行も食べます。

編集:

申し訳ありませんが、後の値=はマルチワード値である可能性があります。

4

1 に答える 1

15

私は間違っている可能性がありますが、ここから、特にページの最後にある注2をざっと読んだ後、ドット演算子と一致するときにbashに改行文字が含まれることがあります。したがって、簡単な解決策は次のようになります。

#!/bin/bash
str='foo = 1
bar = 2
boo = 3
'
re='bar = ([^\
]*)'
if [[ "$str" =~ $re ]]; then
        echo "${BASH_REMATCH[1]}"
else
        echo no match
fi

改行以外のものと一致するように要求していることに注意してください。これがお役に立てば幸いです=)

編集:また、私が正しく理解していれば、^または$は実際には文字列の開始または終了に一致し、行には一致しません。他の誰かがこれを確認できればもっと良いでしょうが、それは事実であり、行ごとに一致させたい場合は、各行を個別に読み取るためにwhileループを作成する必要があります。

于 2012-09-27T11:07:55.980 に答える