さまざまな行のファイルがあり、その中には次のような行があります
173.194.034.006.00080-138.096.201.072.49934
パターンは、3つの数字、次にドット、次に3つの数字、次にドットなどです。
この目的でawk、grep、またはsedを使用したいと思います。この正規表現をどのように表現しますか?
123のような1つのシリーズのラインを取得したいと仮定します。存在する場合は、
grep '[0-9][0-9][0-9]\.' file > numbersFile
123.345のような2つのシリーズが必要な場合は、
grep '[0-9][0-9][0-9]\.[0-9][0-9][0-9]\.' file > numbersFile
などなど。
各[0-9]
平均は、0〜9(0、1、2、3、4、5、6、7、8、9)の範囲の文字の1つの出現にのみ一致します。
なぜなら '。' \.
charは、通常のgrep正規表現では特別な意味を持ち、 「「。」と一致する」ことを示すようにエスケープする必要があります。char(のみ!);-)
grepには、パターンを1回指定し、 (3回の繰り返しを示すために){3}
または時々のような修飾子を含めることができる、すばらしい拡張機能があります。\{3\}
ただし、この拡張機能は、Solaris、AIXなどの古いUnixには移植できません。
これは、システムが修飾子をサポートしているかどうかを確認するための簡単なテストです。(SuperGrep-headsは私の用語を修正することを歓迎します:-)。
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{10\}\.'
echo "173.194.034.006.00080-138.096.201.072.49934" | grep '[0-9]\{2\}\.'
最初のテストは失敗するはずです。grepが修飾子をサポートしている場合、2番目のテストは成功します。
(上記のように)長期的な解決策を学ぶことは害はありません、そしてあなたはこれがどんなgrepでもうまくいくと確信することができます。
IHTH。
awkでは、おそらく文字列を作成してから、次のように検索します。
BEGIN {
p = "[.]"
d = "[[:digit:]]"
d3 = d d d # or d"{3}"
d5 = d d d d d # or d"{5}"
re = d3 p d3 p d3 p d3 p d5 # or "(" d3 p "){4}" d5
}
$0 ~ re "-" re
しかし、それは本当にあなたがそれで何をしたいかに依存します。
見た目では、これらはIPアドレスであり、その後にポート番号、ダッシュ、そしてIPアドレスとポート番号の組み合わせが続きます。
最新のUNIX/Linuxシステムを使用している場合は、
grep -P '(\d{3}\.){4}\d{5}-(\d{3}\.){4}\d{5})'
トリックを行うでしょう-それを行うための最もポータブルな方法ではないかもしれませんが。これは、「Perl正規表現を使用する」オプションに「-P」を使用します。これは、一部の人々が不正行為と見なす可能性があります。
行のこれらの文字列の前または後に余分なテキストがあるかどうかはわかりませんでした。持っている場合は、「-o」オプションを使用して、一致したテキストを抽出し、それ以外はすべて無視できます。