2012-07-11 70 views
0

我有一個很大的文本文件。我想挑出來之後是字符串「foobar的」形式如何獲得所有匹配regex1的字符串後跟一個字符串?

(1, 2, 4, ...) 

的字符串。這兩個字符串都可以出現在多行上。如何在UNIX命令行上快速執行此操作?

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

應該給使用perl

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

可不可以給一個行應匹配的例子嗎? – 2012-07-11 21:59:32

回答

2
$ tr -d '\n' <input | grep -oP '\([^()]*\)(?= foobar)' 
(1, 2) 
(3, 4, 5) 
(6,7, 8) 
(9, 10, 11) 
+0

下面是'sed'管道用於輸出輸出:'sed's /,* /,/ g'' – Steve 2012-07-11 22:42:40

1

一種方式。它將標量變量中的輸入文件的所有內容抽出,並用正則表達式檢查括號之間的任意數字組,然後輸入文字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) 
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刪除第一行
相關問題