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的使用,从而能够更好地应用到实际的工作中去。