1

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

我从 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 ~ $

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

谢谢大家!

4

5 回答 5

2

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

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

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

于 2013-02-15T12:08:00.337 回答
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
于 2013-02-15T12:12:53.733 回答
0

这个 perlmonks 回答

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

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

于 2013-02-15T12:13:30.700 回答
0

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

$var =~ s/^\s+//;  # Trim whitespace from beginning of string
$var =~ s/\s+$//;  # Trim whitespace from end of string
$var .= "\n";      # Add terminating newline
于 2013-02-15T12:14:00.850 回答
-1

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

for ( 1 .. 2 ) {
    1 while chomp $var;
    $var = reverse $var;
}
于 2013-02-15T12:06:47.013 回答