Search code examples
perltextexpecttext-manipulation

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.


Solution

  • 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