drew
drew

Reputation: 21

Remove last line from multi-lined variable

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

Answers (5)

Borodin
Borodin

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

TLP
TLP

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

nwellnhof
nwellnhof

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

robert_b_clarke
robert_b_clarke

Reputation: 1503

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.

Upvotes: 0

Alan Haggai Alavi
Alan Haggai Alavi

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

Related Questions