如何使用Perl在每个grep结果后添加空行?

时间:2013-07-23 16:11:22

标签: perl command-line

如何在每次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)

4 个答案:

答案 0 :(得分: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'

注意:这不适用于包含冒号的文件名。 :)½

答案 1 :(得分:1)

这会在每一行grep输出后打印一个换行符:

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

这会在不同文件的结果之间打印换行符。 (在我阅读时回答问题。)

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

答案 2 :(得分:1)

如果你想使用perl,你可以做类似

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

如果你想使用sed(我似乎已经获得了更好的结果),你可以做类似的事情

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

答案 3 :(得分: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