web-dev-qa-db-ja.com

Bash =〜regexおよびhttps://regex101.com/

https://regex101.com/ を使用する正規表現を作成して、文字列内の最初のIPアドレスを返します。

正規表現:

(?:\d{1,3}\.)+(?:\d{1,3})

区切り文字を含むRegExp:

/(?:\d{1,3}\.)+(?:\d{1,3})/

次のテスト文字列で:

eu-west                       140.243.64.99 

次の完全一致を返します。

140.243.64.99

アンカーなどで何を試しても、次のbashスクリプトは生成された正規表現では機能しません。

temp="eu-west                       140.243.64.99            "
regexp="(?:\d{1,3}\.)+(?:\d{1,3})"
if [[ $temp =~ $regexp ]]; then
  echo "found a match"
else
  echo "No IP address returned"
fi
12
rjm61

\dは、「任意の数字」を言うための非標準的な方法です。私はそれがPerlから来ていると思います、そして他の多くの言語とユーティリティもPerl互換RE(PCRE)をサポートします。 (そして、例えば、GNU grep 2.27は、通常モードでも、Word文字に対して同様の\wをサポートしています。)

ただし、Bashは\dをサポートしていないため、[0-9]または[[:digit:]]を明示的に使用する必要があります。非キャプチャグループ(?:..)についても同様ですが、代わりに(..)のみを使用してください。

これはmatchを出力するはずです:

temp="eu-west                       140.243.64.99            "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match
15
ilkkachu

サイト regex101.com デフォルトとしてPCRE(左上隅をご覧ください)を使用しており、「拡張」正規表現構文のサポートが不足しています。それが「Perl互換の正規表現」であり、Perlから(当然のことながら)Perlに由来しています。

PCREは、いくつかのツール(grep -Pなど)でサポートされていますが、[[…]]イディオム内のbash正規表現のサポートは、拡張正規表現(grep -Eなど)に対してのみサポートされています。

拡張正規表現では、キャプチャ以外の(?…)括弧は存在せず、\ dもありません。シンプルな(…)[0-9]を使用する必要があります:

regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
1
Isaac