Question

couldn't find a solution to this seemingly simple question: 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
';

thanks for your time.

EDIT: 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 :)

thanks everyone!

Was it helpful?

Solution 2

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

OTHER TIPS

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).

From this perlmonks answer

$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.

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

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;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top