removing empty lines from a pipe using sed
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