0

大きなテキストファイルがあります。形の文字列を選びたい

(1, 2, 4, ...)

この後に文字列「foobar」が続きます。これら 2 つの文字列は両方とも、複数の行に表示できます。UNIXコマンドラインでこれをすばやく行うには?

(1, 2) foobar
foobar (3, 4, 5) foobar (23, 45) 
(6,
7, 8) foobar
(9, 10, 11) foo
bar

与えるべき

(1, 2)
(3, 4, 5)
(6, 7, 8)
(9, 10, 11)
4

3 に答える 3

2
$ tr -d '\n' <input | grep -oP '\([^()]*\)(?= foobar)'
(1, 2)
(3, 4, 5)
(6,7, 8)
(9, 10, 11)
于 2012-07-11T22:24:16.343 に答える
1

を使用した片道perl。入力ファイルのすべてのコンテンツをスカラー変数に丸呑みし、正規表現を使用して、括弧とそれに続くリテラルの間の数字のグループをチェックし、foobar一致するたびに出力します。

perl -e '
    chomp( @s = <> );
    $s = join q||, @s;
    printf qq|%s\n|, $1 while $s =~ m/(\((?:,?\s*\d+\s*)+\))\s*foobar/g;
' infile

この内容でinfile:

(1, 2) foobar
foobar (3, 4, 5) foobar (23, 45) 
(6,
7, 8) foobar
(9, 10, 11) foo
bar

出力は次のようになります。

(1, 2)
(3, 4, 5)
(6,7, 8)
(9, 10, 11)
于 2012-07-11T22:20:27.807 に答える
1

これはあなたのために働くかもしれません:

sed '/(/!d;s/(/\n&/;s/^[^\n]*\n//;:a;$!{/) foobar/!N;/) foobar/!ba};s/\n//g;s/\(([^)(]*)\) foobar/\n\1\n/;s/^[^\n]*\n//;P;D' file

説明:

  • /(/!dのない行を削除する(
  • s/(/\n&/最初に改行を追加します(
  • s/^[^\n]*\n//最初の改行を含むすべての文字を削除します。
  • :aプレースホルダー
  • $!{/) foobar/!N;/) foobar/!ba}) foobar最後の行でない場合は、次の行を追加しない場合、まだ) foobarループしない場合はチェックしますa
  • s/\n//gすべての改行を削除します。
  • s/\(([^)(]*)\) foobar/\n\1\n/目的の文字列を改行で囲みます。
  • s/^[^\n]*\n//最初の改行を含むすべての文字を削除します。
  • P最初の行を印刷する
  • D最初の行を削除
于 2012-07-12T03:10:54.900 に答える