web-dev-qa-db-ja.com

セミコロンで区切られたアドレスを抽出し、各アドレスを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]

セミコロンと括弧なしで各アドレスを抽出したい(アドレスはセミコロンで区切られている;)、新しいファイルの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

しかし、それは何も印刷しません。

3
user9371654

拡張正規表現-Eまたはegrep)は\dについて知りません。 @Alexanderの提案に従って-Pを使用するか、代わりに-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 Regex-Pまたはpgrep)を使用:

grep -Po '\d+\.\d+\.\d+\.\d+' myfile.txt

+*に変更すると、基本正規表現を使用することもできます。

grep -o '[0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' myfile.txt
5
pLumo

-E-Pに置き換え、-oを追加します。

 grep -P -o '\d+\.\d+\.\d+\.\d+' myfile.txt
3
Alexander

awkの使用:

awk 'NF' RS='[][;]' infile

または、最初の空の行を気にしない場合はtrを使用します。

tr -s '];[' '\n' <infile
2
αғsнιη

grepは、このタスクにとってはやり過ぎです。 trで十分です:

$ < input.txt tr -d '[]' | tr ';' '\n' | sort -u

sort -u partは、重複するアドレスを削除します。

0
maxschlepzig