Reputation: 21
How can I remove the few lines from a multi-lined variable?
I'm getting this sort of stuff back from Expect and need to neaten it up a little bit
$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 ~ $
';
Those blank lines are representative of what I have. Ideally, I want to make $var look like this:
$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
';
I should clarify; the important part of this question to me is the removal of the following line:
drew ~ $
The whitespace, I think I can cope with.
Upvotes: 2
Views: 3215
Reputation: 126722
A regular expression like s/^[^\S\n]*\n//gm
will remove all lines that contain only whitespace.
Update
If you want to do something more than just remove blank lines, then it is best to split
the string into lines and remove the ones you don't want. This code uses grep
to remove lines that are all-whitespace and then pop
to remove the last one.
my @lines = grep /\S/, split /\n/, $var;
pop @lines;
$var = join '', map "$_\n", @lines;
print $var;
output
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
Upvotes: 1
Reputation: 67900
You can always use a regex substitution:
$var =~ s/^\s*$//gm;
\s*
will match newline, but also other whitespace which you probably do not want. ^
and $
and beginning and end of line anchors. The /m
modifier allows the anchors to match inside the string, at start/end of lines (e.g. at newlines).
Upvotes: 2
Reputation: 33618
You can simply trim whitespace like you would do with a single-line string and add a terminating newline:
$var =~ s/^\s+//; # Trim whitespace from beginning of string
$var =~ s/\s+$//; # Trim whitespace from end of string
$var .= "\n"; # Add terminating newline
Upvotes: 0
Reputation: 1503
$var =~ s/(^|\n)[\n\s]*/$1/g;
Lots of ways to do this though. No problems just looping through and deleting blank lines in my opinion.
Upvotes: 0
Reputation: 74202
For the sake of a different solution that does not use regular expressions, you could use chomp
in a loop:
for ( 1 .. 2 ) {
1 while chomp $var;
$var = reverse $var;
}
Upvotes: -1