从多行变量中删除最后一行

时间:2013-02-15 11:57:19

标签: perl text expect text-manipulation

无法找到这个看似简单的问题的解决方案:如何从多行变量中删除少数几行?

我从Expect那里得到了这种东西,并且需要稍微补充一下

$var='


total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python
drew ~ $

';

这些空白行代表了我所拥有的。理想情况下,我想让$ var看起来像这样:

$var='
total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python
';
谢谢你的时间。

编辑:我应该澄清;这个问题的重要部分是删除以下行:

drew ~ $

空白,我想我可以应付:)

谢谢大家!

5 个答案:

答案 0 :(得分:2)

您始终可以使用正则表达式替换:

$var =~ s/^\s*$//gm;

\s*将匹配换行符,但也会匹配您可能不想要的其他空格。 ^$以及行锚点的开头和结尾。 /m修饰符允许锚点在字符串内部,行的开头/结尾处(例如,在换行符处)匹配。

答案 1 :(得分:0)

s/^[^\S\n]*\n//gm之类的正则表达式将删除仅包含空格的所有行。

<强>更新

如果你想做的不仅仅是删除空行,那么最好将split字符串分成行并删除你不想要的字符串。此代码使用grep删除全空行,然后pop删除最后一行。

my @lines = grep /\S/, split /\n/, $var;
pop @lines;
$var = join '', map "$_\n", @lines;
print $var;

<强>输出

total 20
drwxr-xr-x 5 drew.jess users 4096 2013-01-22 15:51 bash
drwxr-xr-x 2 drew.jess users 4096 2011-11-11 10:37 diff
drwxr-xr-x 8 drew.jess users 4096 2012-02-14 09:09 expect
drwxr-xr-x 3 drew.jess users 4096 2011-10-06 11:05 perl 
drwxr-xr-x 3 drew.jess users 4096 2013-02-07 13:10 python

答案 2 :(得分:0)

来自this perlmonks answer

$ var = ~s /(^ | \ n)[\ n \ s] * / $ 1 / g;

虽然有很多方法可以做到这一点。在我看来,没有问题只是循环并删除空行。

答案 3 :(得分:0)

您可以像使用单行字符串一样修剪空白并添加终止换行符:

$var =~ s/^\s+//;  # Trim whitespace from beginning of string
$var =~ s/\s+$//;  # Trim whitespace from end of string
$var .= "\n";      # Add terminating newline

答案 4 :(得分:-1)

为了使用不使用正则表达式的不同解决方案,您可以在循环中使用chomp

for ( 1 .. 2 ) {
    1 while chomp $var;
    $var = reverse $var;
}