次の入力を含むファイルがあります。ドットで区切られた数字はアドレスを表します。住所のすべての数字は、以下のように1つ以上の数字にすることができます。
[112.112.112.112;3.3.3.3;44.44.44.44]
[6.6.6.6;17.17.17.17;88.88.88.88]
セミコロンと括弧なしで各アドレスを抽出し(アドレスはセミコロンで区切られます;
)、新しいファイルの1行に各アドレスを挿入して次の出力を生成したいと思います。
112.112.112.112
3.3.3.3
44.44.44.44
6.6.6.6
17.17.17.17
88.88.88.88
最初のステップとして、次のようにアドレスを抽出するためにgrepを試みます。
grep -E '\d+\.\d+\.\d+\.\d+' myfile.txt > newfile.txt
しかし、何も印刷されません。
答え1
拡張正規表現(-E
またはegrep
)わかりません\d
。-P
@Alexanderが提案したように-E
or[0-9]
を使用してください[[:digit:]]
。
-o
完全一致行ではなく一致のみを選択するように追加されました。また、個々の一致を新しい行に分割します。
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt
または
grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt
使用パール正規表現(-P
またはpgrep
):
grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt
+
次のように変更しても*
機能します。基本正規表現:
grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
答え2
-E
次に置き換えて-P
追加してください-o
。
grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
答え3
使用awk
:
awk 'NF' RS='[][;]' infile
または、tr
最初の空行が気に入らない場合は、次のようにします。
tr -s '];[' '\n' <infile
答え4
grep
仕事に少し過剰です。tr
十分:
$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u
このsort -u
セクションでは、重複したアドレスを削除します。