0

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

  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{} 构造解决了我的问题

4

2 回答 2

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
于 2013-11-14T00:31:48.813 回答
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.
于 2013-11-13T23:57:22.213 回答