0

キャプチャしたい数字を含むファイルでいっぱいのディレクトリがあります。また、どの番号がどの特定のファイルに由来するのかを知りたいです。今、私はgrepを実行しているだけで、次のような出力が得られます:

grep ./* -e 'expression'
./file1: expression numberA
./file1: expression numberB
./file1: expression numberA
./file2: expression numberC numberD
...

私が望むのは、ファイル名の一部 (この例では file1 の 1) と、式の後に表示されるすべての数字を抽出することです。

私はすべてを bash で行うことを好みますが、どのような解決策も歓迎します。

編集:明確にするために、出力として次のものが必要です:

file1:
numberA
numberB
file2:
numberC
numberD
...

先ほどの部分(./file1:式番号A)も編集しました。前に明確でなくて申し訳ありません。

4

4 に答える 4

1

これを試して:

grep -e 'expression' * | perl -pe 's/^(.*?)(\d+)(:.*)$/$1$2$3 $2/'

これにより、すべての入力行が生成されます。入力行のファイル名部分が数字で終わる場合、その数字を入力行に追加する必要があります。

$1$2および$33 つの部分式 (括弧内の正規表現の部分) への後方参照です。

コマンドライン スイッチ-eは、指定された式を実行するように Perl インタープリターに指示します。-p入力をループして を出力します$_

ただし、試合後のすべての数字も必要なので、おそらくもっと複雑なものが必要になります。

grep -e 'expression' * | perl -ne '
  chomp;
  ($a,$b) = split ":";
  $a =~ s/.*(\d+)$/$1/;
  $b =~ s/.*expression(.*)/$1/;
  $b =~ s/[^\d]+/ /g;
  print "$_ $a $b\n";
'

-nと同じことを行いますが-p、暗黙的に を印刷しません$_

編集:更新された要件を読んだ後、すべての Perl ソリューションを使用する方がよいと思います。

#!/usr/bin/env perl

use strict;
use warnings;

foreach (@ARGV) {
  my $file = $_;
  open FILE, "<$file" or die "Can't open file $file.";
  my $first = 1;
  foreach (<FILE>) {
    if (m/expression(.*)/) {
      my $values = $1;
      if ($first) {
        print "$file:\n";
        $first = 0;
      }
      $values =~ s/(^ +| +$)//g;
      $values =~ s/ +/\n/g;
      print "$values\n";
    }
  }
  close FILE;
}
于 2013-04-14T21:57:48.313 に答える
0

回答してくれた 2 人のおかげで、2 人から提供された情報を使用して、完璧な解決策を見つけることができました。

grep -i expression ./* | perl -pe 's/.*(\d+).*:.*(\d+)/$1 $2/' | sort | uniq

これにより、次の出力が得られます。

1 numberA
1 numberB
2 numberC numberD
于 2013-04-16T15:57:33.747 に答える
0

ファイル番号と番号だけを見たい場合は、次のようなものを使用できます。

find . -exec sh -c "echo -n \;{}::;grep -e 'expression' {}" \; | perl -pe 's/^.*(\d+)::/File \1:\n/' | perl -pe 's/\D*(\d+)$/\1/'

注:::number式に(区切り文字として使用され、変更可能) が含まれている場合、これは壊れます。一致するものが見つからない場合は、最後のファイル名を出力します。

生産します:

File 2:
878
File 3:
199
File 4:
123
234
9
0

例ファイル 2:

foo 123
bar 123
expression 878
lorem ipsum

数値のペア (ファイル番号 + 番号) だけが必要な場合は、次を試してください。

grep ./* -e 'expression' | perl -pe 's/^.*?(\d+):.*?(\d+)$/\1 \2/'

出力:

2 878
3 199
4 123
4 234
4 9
4 0

私のコメントで述べたように、あなたの質問は、あなたが何を望んでいるのか正確には不明です。いくつかの例を提供すると有益です。

于 2013-04-15T09:40:38.660 に答える