
次の入力を含むファイルがあります。ドットで区切られた数字はアドレスを表します。アドレス内の数字は、次のように 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]
セミコロンと括弧なしで各アドレスを抽出し(アドレスはセミコロンで区切られます;
)、各アドレスを新しいファイルの行に挿入して、次の出力を生成します。
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
て[0-9]
ください[[:digit:]]
。
一致する行全体ではなく、一致する行のみを選択するには、追加します-o
。これにより、単一の一致も新しい行に分割されます。
grep -Eo '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' myfile.txt
または
grep -Eo '[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+' myfile.txt
使用してPerl 正規表現(-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
部分は重複したアドレスを削除します。