捕获最后一行

时间:2013-11-13 23:43:39

标签: perl powershell pipeline

我需要处理一个包含以破折号( - )开头的行的文件;这些是需要附加到上一行的延续行。所以我拥有的是:

  Lorem ipsum dolor sit amet, consectetur 
  - adipiscing elit. Donec 
  - consectetur lotis. 
  Sed a est dui.
  Curabitur placerat a tortor
  - vel sodales.

我想要的是:

Lorem ipsum dolor sit amet, consectetur - adipiscing elit. Donec - consectetur lotis.
Sed a est dui. 
Curabitur placerat a tortor - vel sodales.

所以我写了这样的话:

$s = ""
cat $f |%{
    if ($_ -match "^-") { $s += $_ } else { $s; $s = $_; }
} |out-file x.txt

我的问题是:如果文件以虚线结尾,脚本永远不会输出最后一行,因为从管道收到最后一行后,它不知道它是最后一行。

在Perl中,我曾经能够使用像END {}之类的构造来做这些事情。如何在Powershell中处理?

更新

Perl是相关的,因为在那种语言中我可以做类似的事情(其中txt是包含相关文本的文件):

perl -lne '
   BEGIN { $s = "" };
   if (/^-/) { $s .= $_ } else { print $s; $s = $_; }
   END { print $s; }
   ' txt 

正如您所看到的,END {}构造解决了我的问题

2 个答案:

答案 0 :(得分:2)

简短版本,使用您的代码:

$s = ""
cat $f | % {
    if ($_ -match "^-") { $s += $_ } else { $s; $s = $_; }
} -end { $s } | out-file x.txt

更长的版本:

function glue {
   [CmdletBinding()]
   param(
      [Parameter(ValueFromPipeline=$true)]
      $line
   )
   begin { $output = "" }
   process { if ($line -match "^-") { $output += $line } else { $output; $output = $line; }
   end { $output }
}
cat $f | glue | out-file x.txt

答案 1 :(得分:0)

目前尚不清楚数据源中是否存在前导空格。

如果您的文件小于几兆字节,则最简单的方法是将所有数据读入内存并删除换行符。

该程序演示

use strict;
use warnings;

my $data = do {
  local $/;
  <DATA>;
};

$data =~ s/\s*\n\s+-/ -/g;

print $data;

__DATA__
Lorem ipsum dolor sit amet, consectetur 
  - adipiscing elit. Donec 
  - consectetur lotis. 
  Sed a est dui.
  Curabitur placerat a tortor vel sodales.

<强>输出

Lorem ipsum dolor sit amet, consectetur - adipiscing elit. Donec - consectetur lotis. 
  Sed a est dui.
  Curabitur placerat a tortor vel sodales.