2013-07-23 38 views
1

如何在每個grep結果後添加空行?如何使用Perl在每個grep結果後添加空行?

例如,grep的-o 「XYZ」 可以看到這樣的信息 -

file1:xyz 
file2:xyz 
file2:xyz2 
file3:xyz 

我所要的輸出是這樣的 -

file1:xyz 

file2:xyz 
file2:xyz2 

file3:xyz 

我想這樣做

grep "xyz" | perl (code to add a new line after every grep result) 
+0

顯示一些示例性輸入/輸出。 – TLP

+0

@TLP,我編輯了這個問題。 – CodeBlue

+0

修復了您的示例以確保討論多行grep結果 – DVK

回答

3

這是直接回答你的問題:

grep 'xyz' | perl -pe 's/$/\n/' 

但是,這是更好的:

perl -ne 'print "$_\n" if /xyz/' 

編輯

好吧,你的編輯之後,你想要的(幾乎)這樣的:

grep 'xyz' * | perl -pe 'print "\n" if /^([^:]+):/ && ! $seen{$1}++' 

如果你不喜歡空行在開頭,做成:

grep 'xyz' * | perl -pe 'print "\n" if /^([^:]+):/ && ! $seen{$1}++ && $. > 1' 

注意:這將無法正確使用冒號的文件名。 :) ½

+0

grep「xyz」|有什麼問題perl -pe'print'\ n「'我不明白你的陳述是做什麼的。 – CodeBlue

+0

@CodeBlue該版本在行之前打印換行符,而不是之後。 if語句在每組新的冒號標籤之前打印一個換行符。 – tchrist

+0

哦!我懂了。謝謝! – CodeBlue

1

這將在grep輸出的每一行後打印換行符:

grep "xyz" | perl -pe 'print "\n"' 

這會在來自不同文件的結果之間打印換行符。 (因爲我讀它回答這個問題。)

grep 'xyx' * | perl -pe '/(.*?):/; if ($f ne $1) {print "\n"; $f=$1}' 
+0

對不起。根據示例,這不起作用,而是在每行grep返回後打印換行符。 –

+0

我編輯了這個問題! – CodeBlue

1

如果你想使用perl的,你可以,如果你想使用SED(這裏我似乎已經得到了更好的做這樣的事情

grep "xyz" | perl -p -e 's/(.*)/\1\n/g' 

結果),你可以不喜歡

grep "xyz" | sed 's/.*/\0\n/g' 
0

使用狀態機,以確定何時打印空白行:

#!/usr/bin/env perl 

use strict; 
use warnings; 

# state variable to determine when to print a blank line 
my $prev_file = ''; 

# change DATA to the appropriate input file handle 
while(my $line = <DATA>){ 

    # did the state change? 
    if(my ($file) = $line =~ m{ \A ([^:]*) \: .*? xyz }msx){ 

    # blank lines between states 
    print "\n" if $file ne $prev_file && length $prev_file; 

    # set the new state 
    $prev_file = $file; 
    } 

    # print every line 
    print $line; 
} 

__DATA__ 
file1:xyz 
file2:xyz 
file2:xyz2 
file3:xyz 
+1

這是一個恩,*辛勤*的努力量。 :) – tchrist

+0

200行以下的任何東西都是一個微不足道的程序。 – shawnhcorey

相關問題