Bash: How to Delete Empty Lines Using Sed

Introduction

Removing empty lines from files is a common task in Linux Bash scripting. Empty lines can clutter up files and make them harder to read or process. Thankfully, the versatile sed command comes to the rescue. With its powerful text manipulation capabilities, sed provides an efficient way to delete empty lines from files.

In this article, we'll explore how to use sed to eliminate those pesky empty lines, making your scripts and text files cleaner and more manageable. This concise guide will equip you with the knowledge to streamline your scripting tasks. We'll start with the basics of the sed command and the regular expressions used to identify empty lines. Then, we'll combine that knowledge to help you remove all types of empty lines.

What is the sed Command - A Quick Recall

The sed command, short for "stream editor," is a powerful utility in Linux Bash scripting that allows you to perform text transformations on input streams or files. It operates by sequentially reading the input line by line, applying specified commands, and then outputting the modified text.

In the context of deleting empty lines, sed becomes an invaluable tool. It supports regular expressions, which enable us to define patterns for matching and manipulating text. By leveraging sed's regex capabilities, we can easily identify and remove empty lines from files.

With its intuitive syntax and extensive functionality, sed is widely used for a variety of text processing tasks. Its efficiency and versatility make it an excellent choice for automating operations on large-scale projects or within simple one-liner scripts.

How to Identify Empty Lines

Before we can delete empty lines using sed, we need to be able to identify them. Empty lines usually refer to lines that contain no visible characters, including spaces or tabs. However, we'll define an empty line as a line without any characters in it (besides the line termination character \n), just to illustrate the basic concepts without much overhead. Later, we'll introduce a more comprehensive definition and show examples of how to deal with lines without visible characters.

Thankfully, sed allows us to use regular expressions to define patterns for matching such lines. To identify empty lines, we can use the caret (^) symbol to represent the start of a line and the dollar sign ($) symbol to represent the end of a line. By combining these symbols, we can create a regex pattern that matches lines with no content:

/^$/

As discussed before, ^ indicates the start of a line and $ indicates the end of a line. Therefore, ^$ represents a line with no characters between the start and end.

Note: Again, this regular expression matches a line with no characters, not necessarily lines with no visible characters, keep that in mind.

In addition to that, we can use the d command at the end of the pattern to delete the matching lines - /^$/d.

In the next section, we'll explore how to use sed with this regex pattern to delete empty lines from files.

Using sed to Delete Empty Lines

Once we have identified the regex pattern to match empty lines (/^$/), we can leverage the power of sed to delete those lines from files. The sed command allows us to perform in-place editing of files, modifying them directly without the need for creating temporary files.

To delete empty lines using sed, we use the following syntax:

sed -i '/^$/d' <filename>

Here, -i is the option used to perform in-place editing of the file. '/^$/d' is the regex pattern we discussed earlier, enclosed in single quotes. It matches the empty lines and the d command deletes them. Finally, <filename> is the name of the file on which we want to perform the operation.

By executing this sed command, the empty lines in the specified file will be deleted, resulting in a modified version of the file without the empty lines.

Imagine you have a file named users.txt in the current directory and it has the following content:

01; john_doe; [email protected]; New York, USA
02; jane_smith; [email protected]; London, UK

03; bob_marshall; [email protected];  Sydney, Australia

04; alice_johnson; [email protected]; Toronto, Canada

As you can see, there are two empty lines in this file. Suppose they are empty in the sense that they contain no characters (besides the newline character \n).

Now, we can run the previously discussed command on the users.txt file:

sed -i '/^$/d' users.txt

Note: If the file is outside of the directory you're currently positioned in, you should pass the path to the file instead of the file name as the argument of the sed command.

This will change the original users.txt file so it now contains no empty lines:

01; john_doe; [email protected]; New York, USA
02; jane_smith; [email protected]; London, UK
03; bob_marshall; [email protected];  Sydney, Australia
04; alice_johnson; [email protected]; Toronto, Canada

Note: As you saw in the example above, the -i option modifies the file directly, so it's always a good practice to make a backup of your file before applying any sed commands.

Deleting Lines Containing Just Whitespace Characters

But what if the lines look like they are empty, but, in fact, contain only invisible characters (whitespace characters, such as spaces or tabs)? To handle such lines and ensure they are deleted along with empty lines, we can modify our sed command slightly. We can utilize the \s regex pattern to match whitespace characters:

sed -i '/^\s*$/d' <filename>

The/^\s*$/d is the updated regex pattern enclosed in single quotes, where^\s*$ represents a line that starts with zero or more whitespace characters and ends with zero or more whitespace characters. By including \s* in the pattern, we ensure that lines with only whitespace characters are also matched and deleted.

Free eBook: Git Essentials

Check out our hands-on, practical guide to learning Git, with best-practices, industry-accepted standards, and included cheat sheet. Stop Googling Git commands and actually learn it!

Note: There are several other ways to represent zero or more whitespace characters using regex in the sed command. One of the most notable ones is the '/^[[:space:\]]*$/d' regular expression, which you can use interchangeably with the '/^\s*$/d'.

Conclusion

In this article, we explored how to use the sed command in Linux Bash scripting to efficiently delete empty lines from files. By harnessing the power of regular expressions, we were able to identify and remove empty lines, as well as lines containing only whitespace characters. That can be pretty useful for a variety of scenarios, such as data preprocessing, text file cleanup, and much more.

We began by understanding the sed command's capabilities and its role as a stream editor for text manipulation tasks. We then delved into identifying empty lines using regex patterns, specifically targeting lines with no visible content.

Using the sed command with the regex pattern /^$/d, we demonstrated how to delete empty lines in a file, performing in-place editing directly without the need for temporary files.

We expanded our knowledge by addressing lines that contain only whitespace characters. By modifying the regex pattern to /^\s*$/d, we ensured the removal of lines with whitespace-only content.

All-in-all, sed provides a powerful and efficient solution for deleting empty lines in Linux Bash scripting.

Last Updated: July 3rd, 2023
Was this article helpful?

Improve your dev skills!

Get tutorials, guides, and dev jobs in your inbox.

No spam ever. Unsubscribe at any time. Read our Privacy Policy.

© 2013-2024 Stack Abuse. All rights reserved.

AboutDisclosurePrivacyTerms