【发布时间】:2019-02-08 10:14:15
【问题描述】:
我正在尝试处理数据流。
首先我将一个文本文件添加到我的脚本中。
文本文件是这样的:
pierwsza linia koniec
druga linia lorem1 koniec lorem1 lorem1
trzecia linia lorem1 koniec lorem1
czwarta linia lorem1 koniec
piata liniakoniec
szosta linia lorem1 koniec
我想要实现的是一个包含所有行但只有第一次出现 lorem1 的文件。
所以预期的结果应该是这样的
pierwsza linia koniec
druga linia lorem1 koniec
trzecia linia koniec
czwarta linia koniec
piata liniakoniec
szosta linia koniec
我的脚本是这样的
#!/usr/bin/perl -pi
use strict;
my $line = $_;
my $loremcn;
while ( $line = <> ) {
#if ( $line =~ m/lorem1/ )
foreach ( $line =~ m/lorem1/gi ) {
$loremcn++;
if ( $loremcn >= 2 ) {
$line =~ s/lorem1//gi;
}
print "$loremcn\n";
print $line;
chomp $line;
}
}
但结果只是第一行(因为脚本开头的-pi)文本。
该脚本正确计算 lorem1 (7) 的出现次数,但由于 /g 选项,它会删除所有 lorem1 出现次数(它不会单独留下第一个)。
最后,如何将整个更正后的文本打印到屏幕上?
更新
我在其中一个答案上写了这个重要的评论:
在 RL 中,我不能按照你的方式来做。整个练习是找到一种方法来处理流数据。在真实情况下,整个数据不是来自打开的文本,而是从 SAP 流式传输到打印机的假脱机数据。并且这些数据需要在送到打印机的途中进行更正
【问题讨论】:
-
但是如果计数大于 1,你告诉它删除它的每个出现。
-
当您已经打印了
$line时,脚本末尾的chomp的用途是什么? -
是的,我刚刚从 $line =~s/lorem1//gi 编辑了这一行;到 $line =~s/lorem1//; chomp 只是我忘记删除的剩菜;)它什么也没做。我正在苦苦挣扎的是,最后如何打印整个编辑过的文本或将其保存到文件中(我可以通过打印和简单的 > 在命令行中实现,但首先我需要以某种方式打印它)我不'不明白为什么最后会打印第一行?
-
我不清楚你想要什么。您似乎希望从文档中删除所有出现的
lorem1在第一个 之后。那正确吗?但是您的代码做了一些不同的事情:它从出现两次或更多次的每一行中删除所有实例或lorem1。哪个是正确的? -
您好,我想在文档中第一次出现之后删除所有出现的 lorem1,最后在屏幕上打印整个编辑过的文本。