Sed删除指定行—解析与示例(命令删除文件中的行)

Sed(Stream Editor) 是一款强大的文本流编辑器,使用它可以直接修改文件或者通过管道处理程序流,是Linux下非常常用的文本处理工具之一。本文将围绕sed删除指定行展开具体的探究。

一、sed 命令删除指定行

sed删除行有许多不同的方法,其中最常用的是使用sed的d(delete)命令。一般情况下,d命令要和模式匹配结合使用才有意义。以下是一些示例

# 删除指定行
sed '2d' filename >filename2

# 删除指定的多行
sed '2,4d' filename >filename2

# 支持正则匹配删除
sed '/^test/d' filename >filename2

上面的命令中,第一条命令将文件中的第二行删除,并将经过处理的数据输出到文件filename2中。第二条命令删除文件中的2到4行。第三条命令使用了正则表达式,删除所有以”test”开头的行。

二、与其他命令结合使用

sed和其他命令结合使用,非常的强大。比如删除某个位置的行以及改变某个位置的数据等。以下是一些示例:

# 替换行
sed '2c 找到了它' filename >filename2

# '!'字符意思是非,所以执行下面命令的是将文件中的非1、3操作的行输出。
sed -n '1!p;3!p' filename

第一条命令将文件中第二行的原始数据替换为字符串“找到了它”。在执行过后, filename2 中将是替换后的数据。第二个示例使用了“!”字符。它表示的是之前的行不被执行sed命令,而输出。

三、删除空白行

删除空白行需要嵌套两个sed命令,示例如下:

cat file.txt | sed '/^$/d'

以上命令的作用是删除 file.txt 文件中的空白行,通过使用“^$”正则表达式进行匹配,然后使用 d 命令进行删除。然后将输出接收到 file.txt 文件中,完成了该操作。

四、删除匹配行之间的内容

在删除指定行之间的内容时,我们可以使用 sed 的“1,/data/d”命令,其中 1 表示删除前一行(即首行),/data/ 表示匹配字符串“data”,最后一个 d 表示删除匹配行。举个例子:

cat file.txt
----------------
1
2
3
data
4
5

cat file.txt | sed '1,/data/d'
----------------
4
5

在本示例中,sed 命令匹配了 1 行至 /data/ 行之间的内容,并且将它们删除。

五、删除包含特定字符的行

如果你想要删除包含特定字符的行如“#include”,可以使用以下命令:

sed '/#include/d' filename.h > filename-out.h

其中,#include 是你想要删除的字符串,而 filename.h 和 filename-out.h 分别是源文件和输出文件。代码还可以在命令行中执行:

sed -i '/#include/d' filename.h

-i 参数意思是直接修改文件,而不是输出到标准输出(默认输出)中。

六、如何在同一行内删除多个指定字符串的行

下面的例子分别演示了如何在同一行内删除多个指定字符串的行。其中 -e 参数用于给出多个 sed 命令:

sed -e 's/stringToDelete1//g' -e 's/stringToDelete2//g' input.txt > output.txt

可以用多次 -e 选项,在同一行上完成多个操作。

七、多个文件同时处理

处理多个文件时,可以使用通配符(如 *.txt);如下是个简单的示例:

sed '/#include/d' *.h > /tmp/output.h

它将从所有的 .h 文件中删除行,然后输出到 /tmp/output.h 文件。

八、结语

本文示例了sed的各种应用场景,从这些例子可以看出,sed 正则表达式加上可执行的命令,可以产生强大的效果。然而,正如本文中所示的,有时它需要更精确的使用,和更复杂的组合。因此,我们需要更加深入地学习sed的使用,从而能够更好地应用到实际的工作中去。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平