无法找到这个看似简单的问题的解决方案:如何从多行变量中删除少数几行?
我从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 ~ $
空白,我想我可以应付:)
谢谢大家!
答案 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)
$ 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;
}