deostroll
deostroll

Reputation: 11975

removing empty lines from a pipe using sed

$ find ~/AppData/Local/atom/ -name atom.sh -type f | grep -FzZ 'cli/atom.sh' | sed '/^\s*$/d' | cat -n
     1  /c/Users/devuser/AppData/Local/atom/app-1.12.1/resources/cli/atom.sh
     2  /c/Users/devuser/AppData/Local/atom/app-1.12.2/resources/cli/atom.sh
     3

I tried a number of sed/awk-based options to get rid of the blank line. (#3 in the output). But I can't quite get it right...

I need to get the last line into a variable...

The below actual command I am working with fails to give an output...

 find ~/AppData/Local/atom/ -name atom.sh -type f | grep -FzZ 'cli/atom.sh' | sed '/^$/d' | tail -n 1

Upvotes: 2

Views: 6822

Answers (3)

janos
janos

Reputation: 124656

The problem is the -Z flag of grep. It causes grep to terminate matched lines with a null character instead of a newline. This won't work well with sed, because sed processes input line by line, and it expects each line to be terminated by a newline. In your example grep doesn't emit any newline characters, so as far as sed is concerned, it receives a block of text without a terminating newline, so it processes it as a single line, and so the pattern /^\s*$/ doesn't match anything.

Furthermore, the -z flag would only make sense if the filenames in the output of find were terminated by null characters, that is with the -print0 flag. But you're not using that, so the -z flag in grep is pointless. And the -Z flag is pointless too, because that should be used when the next command in the pipeline expects null-terminated records, which is not your case.

Do like this:

find ~/AppData/Local/atom/ -name atom.sh -type f -print0 | grep -zF 'cli/atom.sh' | tr '\0' '\n' | tail -n 1

Upvotes: 0

heemayl
heemayl

Reputation: 42017

Not all sed's support the token \s for any whitespace character.

You can use the character class [[:blank:]] (for space or tab), or [[:space:]] (for any whitespace):

sed '/^[[:blank:]]*$/d'
sed '/^[[:space:]]*$/d'

Upvotes: 0

Avinash Raj
Avinash Raj

Reputation: 174706

Below sed command would remove all the empty lines.

sed '/^$/d' file

or

Below sed command would remove all the empty lines and also the lines having only spaces.

sed '/^[[:blank:]]*$/d' file

Add -i parameter to do an in-place edit.

sed -i '/^[[:blank:]]*$/d' file

Upvotes: 9

Related Questions