I want to remove all empty lines from a file. Even if the line contains spaces or tabs it should also be removed.

8 Answers 8


Just grep for non-blanks:

grep '[^[:blank:]]' < file.in > file.out

[:blank:], inside character ranges ([...]), is called a POSIX character class. There are a few like [:alpha:], [:digit:]... [:blank:] matches horizontal white space (in the POSIX locale, that's space and tab, but in other locales there could be more, like all the Unicode horizontal spacing characters in UTF8 locales) while [[:space:]] matches horizontal and vertical white space characters (same as [:blank:] plus things like vertical tab, form feed...).

grep '[:blank:]'

Would return the lines that contain any of the characters, :, b, l, a, n or k. Character classes are only recognised within [...], and ^ within [...] negates the set. So [^[:blank:]] means any character but the blank ones.

  • 1
    should there also be a $ for end of line? Nov 16, 2013 at 21:10
  • @MichaelDurrant It's not anchored on either side
    – jordanm
    Nov 16, 2013 at 21:11
  • 1
    @MichaelDurrant. [^[:blank:]]$ would only match lines that end in a non-blank. We want lines that contain a non-blank anywhere Nov 16, 2013 at 21:11
  • @StephaneChazelas I tried grep [:blank:] SOURCEFILE even this command is working. I understand [] is for character class can you please give me some idea on how it works ? the snippet :blank: is new to me. Nov 16, 2013 at 21:52
  • Are there any cases where grep -E '\S' wouldn't work?
    – terdon
    Apr 6, 2016 at 14:33

Here is an awk solution:

$ awk NF file

With awk, NF only set on non-blank lines. When this condition match, awk default action that is print will print the whole line.

  • Neat, this also removes lines with whitespace.
    – wisbucky
    Apr 25, 2019 at 22:24
  • awk -i inplace NF file to replace the file.
    – user598527
    May 22 at 10:02

How about:

sed -e 's/^[[:blank:]]*$//' source_file > newfile


sed -e '/^[[:blank:]]*$/d' source_file > newfile


For each line, substitute:

  • if it starts ("^")
  • with spaces or tabs ("[[:blank:]]") zero or more times ("*")
  • and then is the end of the line ("$")

More info on ::blank:: and other special characters at http://www.zytrax.com/tech/web/regex.htm#special

  • 4
    [[:space:]] includes tabs. If it didn't your regex would fail if a space followed a tab.
    – jordanm
    Nov 16, 2013 at 21:06
  • The wctype(3) and isalpha(3) manpages describe what the character classes will match.
    – jordanm
    Nov 16, 2013 at 21:10
  • You may want to remove the first one which doesn't answer the question. Nov 16, 2013 at 21:33
  • @MichaelDurrant can you please write some thing about [[:blank:]] ? Nov 16, 2013 at 22:00
  • Added info for [[:blank::]]. Stephane, why doesn't the first work? I thought // at the end would replace the line without nothing. Nov 16, 2013 at 22:56

Looks like I've found one not that fast, but funny at last:

| xargs -L1

  • 1
    Nice short one, but it does more: remove leading spaces and tabs as well.
    – jringoot
    Jul 4, 2017 at 5:25
  • Oh, it's found to be even more capable? — Nice! ;-P
    – poige
    Jul 4, 2017 at 7:06
  • 2
    And it truncates lines (default at 1024 chars) See manpages: linux.die.net/man/1/xargs
    – jringoot
    Jul 5, 2017 at 9:34
  • I'm falling deeper in love with that simple tool!!!11 )
    – poige
    Jul 5, 2017 at 13:13

You can use sed command for removing blank lines:

sed '/^$/d' in > out

This command deletes all empty lines from the file "in"

  • 1
    That doesn't delete lines containing only space and tab, as specifically requested. Jun 15, 2016 at 20:15

Try ex-way:

ex -s +'v/\S/d' -cwq test.txt

For multiple files (edit in-place):

ex -s +'bufdo!v/\S/d' -cxa *.txt

Note: The :bufdo command is not POSIX.

Without modifying the file (just print on the standard output):

cat test.txt | ex -s +'v/\S/d' +%p +q! /dev/stdin

Use the following command:

grep '\S' FILE

which removes all lines including spaces or tabs.

Otherwise, removal not including lines with spaces/tabs, use:

grep . FILE

For example:

$  printf "line1\n\nline2\n \nline3\n" > FILE
$  cat -v FILE


$  grep '\S' FILE
$  grep . FILE


See also:


strings looks at line-endings as something not-a-string.

cat file.txt | strings

...and all empty lines are gone.

  • 4
    Welcome to the site, and thank you for your contribution. Unfortunately, strings only looks at "printable characters followed by a non-printable character". Space is "printable", so it will print lines that only contain spaces. The only reason why it apparently may work is because it has a lower threshold of what it considers a string (the default is 4 characters), so any line that contains less than 4 spaces and nothing else will be discarded - but so will be any line that contains less than 4 alphabetic characters. Lines with more than 4 spaces will be printed.
    – AdminBee
    Mar 9, 2021 at 14:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.