セミコロンで区切られたアドレスを抽出し、各アドレスを1行に出力します。

セミコロンで区切られたアドレスを抽出し、各アドレスを1行に出力します。

次の入力を含むファイルがあります。ドットで区切られた数字はアドレスを表します。アドレス内の数字は、次のように 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部分は重複したアドレスを削除します。

関連情報