Use the sed command to delete specific lines of the file efficiently

ed is short for Stream Editor, which is used in Linux Basic text conversion is an important part of file operation command Therefore, we can also use it to delete text.

The following are some examples of using the sed command, covering most usage scenarios. It helps you learn the sed command from simple to deep, so that you can easily delete specific lines of files efficiently.

First, we prepare a demo file sed-demo.txt

# cat sed-demo.txt

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Then we can experiment with the sed command.

1. Delete a line

First, let's start by deleting a row, such as the first row and the last row, which is actually the nth row.

Delete the command format on line N:

sed 'Nd' file
 Let's delete the first line and try:

# sed '1d' sed-demo.txt

After deletion:
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

It's simple, isn't it? There is no more explanation here. If you want to delete the contents of the first line, you just need to replace 1 in the command.

The question is, what number is the last line? Here's a little hint. You can use the dollar sign $to represent the last line, so the command to delete the last line can be written as follows:

# sed '$d' sed-demo.txt

After deletion:
1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu

2. Delete some lines

The sed command can delete continuous or discontinuous lines.

Delete consecutive lines, such as 5 to 7 lines:

# sed '5,7d' sed-demo.txt

After deletion:
1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
8 Debian
9 Ubuntu
10 openSUSE

Delete discontinuous lines, such as the first, fifth, ninth and last lines:

# sed '1d;5d;9d;$d' sed-demo.txt

After deletion:

2 Unix Operating System
3 RHEL
4 Red Hat
6 Arch Linux
7 CentOS
8 Debian

In addition, it can also cooperate with logical non! Use, such as deleting lines other than lines 3 to 6:

# sed '3,6!d' sed-demo.txt

After deletion:

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux

3. Delete blank lines

sed also supports deleting blank lines of files. The commands are as follows:

# sed '/^$/d' sed-demo.txt

After deletion:

1 Linux Operating System
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Tip: the expressions in the two slashes / / here play the role of text matching. You can refer to the use of regular expressions. Here are some common methods to deepen your learning.

4. Delete lines containing specific characters

Suppose we want to delete the line content containing the word System in the sample file, we can use / System /, which means to match the string System. The specific commands are as follows:

# sed '/System/d' sed-demo.txt

After deletion:

3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Not only that, we can also add the following logical conditions, such as the following commands:

# sed '/System\|Linux/d' sed-demo.txt

After deletion:

3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

The symbol \ | represents logical or. The above command means that all lines with System or Linux in the text should be deleted.

5. Delete the line beginning with a specific character

First, let's create another sample file sed-demo-1.txt for better demonstration. Its contents are as follows:

# cat sed-demo-1.txt

After deletion:
Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6

As mentioned above, the $sign can be understood as the end, so is there a character that can represent the beginning? The answer is yes. Here we can start with a ^ sign.

Then, when we want to delete a line starting with a certain character, for example, delete a line starting with R, we can use the following command:

# sed '/^R/d' sed-demo-1.txt

After deletion:
Linux Operating System
Unix Operating System
Fedora
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6

Then the question arises. For example, if I want to delete the line beginning with R or F, do I have to execute the command twice? If there are more, don't you have to execute multiple commands? There is a simple way to write it here. You just need to write these characters in a pair of brackets []:

# sed '/^[RF]/d' sed-demo-1.txt

After deletion:
Linux Operating System
Unix Operating System
debian
ubuntu
Arch Linux - 1
2 - Manjaro
3 4 5 6

The above command is used to delete lines starting with R or F.

6. Delete lines ending with specific characters

For the same reason as the above, delete the line ending with a certain character, for example, delete the line ending with m. we can do this:

# sed '/m$/d' sed-demo.txt

After deletion:
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Delete the line ending with x or m, which can be written as follows:

# sed '/[xm]$/d' sed-demo.txt

After deletion:

3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

7. Delete lines beginning with capital letters

Here's the problem again. Do I want to delete all lines starting with uppercase letters? Do you want to write the 26 letters A to Z in [] according to the above method? In fact, we don't have to do this. Just add A - between A and Z:

# sed '/^[A-Z]/d' sed-demo-1.txt

After deletion:
debian
ubuntu
2 - Manjaro
3 4 5 6
 Witty, you will certainly think of other similar usages here. You might as well see if there are any commands you think of below.

8. Delete lines containing alphabetic characters

# sed '/[A-Za-z]/d' sed-demo-1.txt

After deletion:
3 4 5 6

9. Delete rows containing numbers

# sed '/[0-9]/d' sed-demo-1.txt

After deletion:

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu

In addition, through this example, we can add ^ and $to better see the difference between them:

# sed '/^[0-9]/d' sed-demo-1.txt

After deletion:

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
Arch Linux - 1
# sed '/[0-9]$/d' sed-demo-1.txt

After deletion:

Linux Operating System
Unix Operating System
RHEL
Red Hat
Fedora
debian
ubuntu
2 - Manjaro

10. Other more

In fact, the file content we want to delete is more specific, and simple conditions can not meet our needs. Therefore, sed also supports more complex condition combinations. For example, if I want to specify the deletion of the word Linux in lines 1 to 6, then:

# sed '1,6{/Linux/d;}' sed-demo.txt

After deletion:
2 Unix Operating System
3 RHEL
4 Red Hat
5 Fedora
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Delete the content that contains System and its next line:

# sed '/System/{N;d;}' sed-demo.txt

After deletion:
3 RHEL
4 Red Hat
5 Fedora
6 Arch Linux
7 CentOS
8 Debian
9 Ubuntu
10 openSUSE

Posted on Fri, 03 Dec 2021 02:56:59 -0500 by etoast