Bash =~正規表現とhttps://regex101.com/

Bash =~正規表現とhttps://regex101.com/

使用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

(:...)\dPerlまたは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})"

関連情報