2

stdin で IPv6 アドレスを検索するシェル コマンドを作成するにはどうすればよいですか?

1 つのオプションは、次を使用することです。

grep -Po '(?<![[:alnum:]]|[[:alnum:]]:)(?:(?:[a-f0-9]{1,4}:){7}[a-f0-9]{1,4}|(?:[a-f0-9]{1,4}:){1,6}:(?:[a-f0-9]{1,4}:){0,5}[a-f0-9]{1,4})(?![[:alnum:]]:?)'

この RE は「有効な IPv6 アドレスに一致する正規表現」からのアイデアに基づいていますが、これは正確ではありません。さらに醜い正規表現を使用することもできますが、もっと良い方法、私が知らないコマンドはありますか?

4

1 に答える 1

2

シェル スクリプト コマンドを使用する簡単な方法が見つからなかったので、Python で独自の方法を作成しました。

#!/usr/bin/env python

# print all occurences of well formed IPv6 addresses in stdin to stdout. The IPv6 addresses should not overlap or be adjacent to eachother. 

import sys
import re

# lookbehinds/aheads to prevent matching e.g. 2a00:cd8:d47b:bcdf:f180:132b:8c49:a382:bcdf:f180
regex = re.compile(r'''
            (?<![a-z0-9])(?<![a-z0-9]:)
            ([a-f0-9]{0,4}::?)([a-f0-9]{1,4}(::?[a-f0-9]{1,4}){0,6})?
            (?!:?[a-z0-9])''', 
        re.I | re.X)

for l in sys.stdin:
    for match in regex.finditer(l):
        match = match.group(0)
        colons = match.count(':')
        dcolons = match.count('::')
        if dcolons == 0 and colons == 7:
            print match
        elif dcolons == 1 and colons <= 7:
            print match
于 2012-09-13T00:36:35.693 に答える