Bash - an odd problem using sed or awk or for

John Horne john.horne at plymouth.ac.uk
Thu Nov 29 23:33:21 UTC 2012


Hello,

I have a bash script in which a variable is set to one or more lines of
text. What I want is to remove any lines up to and including a blank
line (or alternatively to echo all the lines after the last blank line).
There may be zero or more blank lines, and the blank lines need not be
consecutive. If there is no blank line, then all the lines should be
shown. If the last line is blank, then nothing should be shown. So for
example the variable may contain:

============ (the '=' are not part of the variable)
abc def

hijk
xyz
============

So in this case what is wanted is:

============
hijk
xyz
============

to be shown.

I tried something like:

   echo "$XX" | sed -e '/./,/^$/d'

but this didn't display anything. (Where XX is the variable.)
I also tried using a 'for' loop but again this displayed nothing:

   opt=""
   IFS=$'\n'
   for n in $XX; do test -z "$n" && opt="" || opt="$opt $n"; done

(Echoing $opt after this shows that it contains nothing.) I'm not sure
why but even using a for loop just to show it had seen a blank line
didn't work either (using something like 'test -z "$n" && echo found').
My understanding was that by setting IFS to a newline, then the 'for'
loop should see the blank line and just set '$n' to the null string. We
should then be able to test on that.

Ideally what I am looking for is a snappy one line 'sed' or 'awk'
command to handle this :-) Unfortunately at the moment I seem to be
getting nowhere though, even with the 'for' loop.



Thanks,

John.

-- 
John Horne, Plymouth University, UK
Tel: +44 (0)1752 587287    Fax: +44 (0)1752 587001



More information about the users mailing list