使用https://regex101.com/文字列にIPアドレスが最初に表示されることを返す正規表現を作成しました。
正規表現:
(?:\d{1,3}\.)+(?:\d{1,3})
区切り文字を含む正規表現:
/(?:\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
答え1
\d
「すべての数字」を言う非標準的な方法です。 Perlから来たようですが、他の多くの言語やユーティリティもPerl互換RE(PCRE)をサポートしています。 (たとえば、Debian StretchのGNU grep 2.27は、通常\w
モードでも同様の単語文字をサポートしています。)
ただし、Bashはこれをサポートしていないため、\d
明示的に[0-9]
orを使用する必要があります[[:digit:]]
。キャプチャしないグループの場合も同様です。(?:..)
自分で使用してください(..)
。
次のように印刷する必要がありますmatch
。
temp="eu-west 140.243.64.99 "
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"
[[ $temp =~ $regexp ]] && echo match
答え2
(:...)
\d
PerlまたはPCRE正規表現演算子(GNUと同様)grep -P
。
bash
の拡張正規表現のみがサポートされているが引用符のない拡張(例:inまたは)の結果ではなく、inなどのgrep -E
文字通りに渡される正規表現の場合、POSIX拡張正規表現機能セットに制限されます。[[ text =~ regexp-here ]]
[[ text =~ $var ]]
[[ test =~ $(printf '%s\n' 'regexp-here') ]]
したがって、動作しているシステムでもgrep -E '\d'
(GNU EREはすでにPerl正規表現からいくつかの拡張機能を取得しており、将来\s
のバージョンでは利用可能になります\d
)、次のものを使用する必要があります。
regexp='\d'
[[ $text =~ $regexp ]]
うまく作ってくださいbash
([[ $text =~ \d ]]
できません)。
PCREをサポートするシェルの場合は、以下を使用する必要がありますzsh
。
set -o rematchpcre
[[ $text =~ '(?:\d{1,3}\.)+(?:\d{1,3})' ]]
ksh93は、パターンマッチングの一部としてPerlに似た正規表現(完全に互換性がない)の独自の実装もサポートしています。そこから以下を使用できます。
regexp='~(P)(?:\d{1,3}\.)+(?:\d{1,3})'
[[ $text = $regexp ]]
(=
代わりに注意してください=~
。一時変数を使用しないと多くの問題が発生するため、一時変数を使用する必要があります。)
答え3
ウェブサイト正規表現101.comPCRE(左上を参照)をデフォルトとして使用し、「拡張」正規表現構文のサポートが不足しています。これは「Perl互換正規表現」であり、Perlに由来しました(合理的に予想されるように)。
場合によっては、PCREはいくつかのツール(例:)でサポートされていますが、grep -P
イディオムのbash正規表現サポートは[[…]]
拡張正規表現(例grep -E
:)にのみ適用されます。
拡張正規表現には非キャプチャ(?…)
括弧はなく、\ dもありません。簡単(…)
で、以下を使用する必要があります[0-9]
。
regexp="([0-9]{1,3}\.)+([0-9]{1,3})"