我需要处理一个包含以破折号( - )开头的行的文件;这些是需要附加到上一行的延续行。所以我拥有的是:
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 {}构造解决了我的问题
答案 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.