1行に複数回表示される正規表現のgrepを作成する方法

1行に複数回表示される正規表現のgrepを作成する方法

正規表現をgrepしたいです。私が探しているパターンが連続して何度も表示されることがあります。パターンが複数回表示される場合は、各項目をカンマで区切って印刷したいと思います。競争のみ新しいファイルに完全な行がありません。印刷したい行に表示されない場合

はい。この正規表現を使用して、[12.123.1.3]パターンの数字を見つけたいと思います。

grep -oh "\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\]" 'filename'

入力ファイル(input.txt)

blabla [11.335.2.33] xyuoeretrete [43.22.11.88] jfdfjkfbs [55.66.77.88]
blabla [66.223.44.33]
foo bar
blabla [1.2.33.3] xyuoeretrete [42] bla[1.32.2.4]

新しいファイル(output.csv)の推定結果:

11.335.2.33,43.22.11.88,55.66.77.88
66.223.44.33
n.a.
1.2.33.3,1.32.2.4

注:私はUbuntuを使います。

ベストアンサー1

そしてperl

perl -lne '
  if (@ips = /\[(\d{1,3}(?:\.\d{1,3}){3})\]/g) {
    print join ",", @ips;
  } else {
    print "n.a.";
  }'

Regexp::Commonまたは、libregexp-common-perlUbuntuなどのDebianベースのシステムのパッケージ内のドットで区切られたクワッドIPv4アドレスの正規表現を使用します。

perl -MRegexp::Common=net -lne '
  if (@ips = /\[($RE{net}{IPv4})\]/g)
    print join ",", @ips;
  } else {
    print "n.a.";
  }'

を使用すると、-nstdinが入力を提供し、パスが追加の引数として提供されているファイルから読み取られたり、などの引数が渡された場合は、いくつかのコマンドの出力から読み取ることができますsome commands|。デフォルトではstdoutとして印刷perlし、(追加)または(ファイルが最初に切り取られずに読み書きモードで開かれることを除いて)printなどのリダイレクト演算子を使用してシェルからファイルにリダイレクトできます。そして、おそらくシェルによってはより多くのものがあります。 。>>>1<>>

入力ファイルの内容を最終的に置き換える出力オプションを追加することもできます-i(そのパスは引数として指定する必要があります)。

ここで、入力は名前付きファイルから取得され、出力input.txtでファイルを上書きまたは生成します。output.csv

< input.txt perl... > output.csv

おすすめ記事