正規表現を使用して文字列からすべての数字とIPを取得するには?

正規表現を使用して文字列からすべての数字とIPを取得するには?

次の例の文字列があるとします。

<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>

私の考えではタブレットこれ最初の数字 そしてこれ知的財産権次の形式を使用してください。

0 10.0.100.10

sed 's@^[^0-255]*\([0-255]\+\).*@\1@'最初の()番号とIP(grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}')を抽出する方法を知っていますが、その時1行で達成できるかどうか知りたいです。

答え1

すべての(整数)数値とすべてのIP(v4)アドレスが必要な場合は、grepを使用して正規表現に代替エントリを追加してください。

... | grep -oE '[0-9]+|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'

これにより、1行に1つの値が印刷され、もちろん最後0からキャプチャされます。ETH0


上記のような構造の数字とIPを含む入力行だけが必要な場合(他の構造は必要ありません)、たとえばsedを使用できます。

... | sed -nEe 's,.*<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>.*,\1 \2,p'

\1そして、括弧内の最初と2番目のグループに対応することは、\2明確さと怠惰のためにここにIPを一致させました。[0-9.]+


またはPerlでも同様です:

... | perl -ne 'print "$1 $2\n" if m,<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>,'

答え2

数字以外の文字(「.」ではない)をすべて空白に置き換えると、最初と2番目の列を印刷できます。

echo '<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>' | \
   sed -re 's;[^0-9.]; ;g' | \
   awk '{print $1,$2}'

出力:

0 10.0.100.10

PS:「.」がある場合は、より複雑にする必要があります。 IPだけでなく他の場所でも同様です。

答え3

使用xq(からhttps://kislyuk.github.io/yq/)、入力が実際に質問の単一のXMLノードであると仮定します。

xq -r 'to_entries[] | [ (.key|ltrimstr("ETH")|rtrimstr("_IP")), .value ] | @tsv' file.xml

これはXML文書をJSONに変換し、タグ名ETHの先頭と末尾を_IP削除して残りのタグ名を抽出します。 IPアドレスも抽出され、結果の2つの値がタブ区切りリストとして出力されます。

ltrimstr()呼び出しは、rtrimstr()ラベル名から数字以外のすべての文字を削除するorに置き換えることができます。gsub("[^[:digit:]]"; ""))gsub("\\D"; ""))

中間JSONドキュメントは次のとおりです。

{
  "ETH0_IP": "10.0.100.10"
}

...最終出力は次のとおりです。

0       10.0.100.10

関連情報