当前位置: 首页 > 科技观察

运用sed命令高效地删除文件的特定行

时间:2023-03-22 17:09:57 科技观察

使用sed命令高效删除文件中特定行删除内容,然后选中这些行按delete键删除,数据量小的时候没问题。但是,一旦文件中的行数据很多,而且数据是冗余的,如果还用上面的方法去做就惨了。为此,今天的文章将带大家学习如何使用sed命令行工具,在数据量很大的情况下,高效优雅地删除文件中的特定行。sed是StreamEditor的缩写。它用于Linux中的基本文本转换,是文件操作的重要命令。因此,我们也可以用它来删除文本。以下是一些sed命令的使用示例,涵盖了大部分的使用场景,帮助您由浅入深地学习sed命令,让您轻松高效地删除特定行的文件。首先,我们准备一个演示文件sed-demo.txt。#catsed-demo.txt1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE然后我们可以使用sed命令进行实验。注:-i表示直接进行文件操作,不在终端显示结果。因为是演示,这里没有使用-i选项。在实践中,请带上-i选项。1、删除一行首先我们从删除一行开始,比如删除第一行和最后一行,其实就是第N行。删除第N行的命令格式:sed'Nd'file我们把第一行删掉试试:#sed'1d'sed-demo.txtAfterdeletion:2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE很简单吧?这里就不多解释了,你想删除前几行的内容,只需要在命令中替换1就可以了。问题来了,最后一行代表的数字是多少?这里给大家一个小提示,可以用美元符号$来表示最后,所以删除最后一行的命令可以这样写:#sed'$d'sed-demo.txtAfterdeletion:1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu2。删除一些行sed命令可以删除连续的或不连续的行。删除连续的行,例如删除第5到7行的内容:#sed'5,7d'sed-demo.txtAfterdeletion:1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat8Debian9Ubuntu10openSUSE删除不连续的行,例如删除第1、5、9和最后一行:#sed'1d;5d;9d;$d'sed-demo.txtAfterdeletion:2UnixOperatingSystem3RHEL4RedHat6ArchLinux7CentOS8Debian另外还可以配合逻辑NOT!使用,比如删除第3~6行以外的行:#sed'3,6!d'sed-demo.txt删除后:3RHEL4RedHat5Fedora6ArchLinux3。删除空行sed也支持删除文件中的空行,命令如下:#sed'/^$/d'sed-demo.txtAfterdeletion:1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE这里提示:表达式起到文本匹配的作用,可以参考正则表达式的使用。下面将列出一些常用的方法来加深您的学习。4.删除包含特定字符的行假设我们要删除示例文件中包含单词System的行内容,我们可以使用/System/,表示将匹配字符串System,具体命令如下:#sed'/System/d'sed-demo.txtAfterdeletion:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE不仅如此,我们还可以添加一些逻辑条件,例如下面的命令:#sed'/System\|Linux/d'sed-demo.txtAfterdeletion:3RHEL4RedHat5Fedora7SEcentOS8Debian9Ubuntu10open符号\|代表逻辑或,上述命令的意思是必须删除文中包含System或Linux的行。5.删除以特定字符开头的行首先,为了更好的演示,我们再创建一个示例文件sed-demo-1.txt,其内容如下:#catsed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntuArchLinux-12-Manjaro3456上面有也有说过,$符号可以理解为结束,那么有没有什么字符可以代表开始呢?答案是肯定的,这里我们可以用^号来表示开头。那么,当我们要删除某个字符开头的行时,比如删除R开头的行,可以使用如下命令:#sed'/^R/d'sed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemFedoradebianubuntuArchLinux-12-Manjaro3456那么问题来了,比如我要删除R或者F开头的行,是不是要执行两次命令?如果多的话,我不是要多次执行命令吗?这里有一个简单的写法,你只需要将这些字符写在一对方括号[]中:#sed'/^[RF]/d'sed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemdebianubuntuArchLinux-12-Manjaro3456上述命令的作用是删除以R或F开头的行。6.删除以特定字符结尾的行同上,删除以某个字符结尾的行,例如删除以m结尾的行,我们可以这样做:#sed'/m$/d'sed-demo.txtAfterdeletion:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE删除以x或m结尾的行可以这样写:#sed'/[xm]$/d'sed-demo.txtAfterdeletion:3RHEL4RedHat5Fedora7CentOS8Debian9Ubuntu10openSUSE7。删除大写字母开头的行问题又来了,我想删除所有大写字母开头的行呢?按照上面的方法,是不是要把A到Z的26个字母写成[]?其实我们不用这么干,只要在A和Z之间加一个-就可以了:#sed'/^[A-Z]/d'sed-demo-1.txtAfterdeletion:debianubuntu2-Manjaro3456机智,你肯定会觉得看到这里还有其他类似的用法,看看Bar下面有没有你想到的命令。8.删除包含字母字符的行#sed'/[A-Za-z]/d'sed-demo-1.txtAfterdeletion:34569。删除包含数字的行#sed'/[0-9]/d'sed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntu另外,在这个例子中,我们可以添加^和$以更好地了解它们三者之间的区别:#sed'/^[0-9]/d'sed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntuArchLinux-1#sed'/[0-9]$/d'sed-demo-1.txtAfterdeletion:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntu2-Manjaro10。其他more其实我们要删除的文件内容比较具体,简单的条件不能满足我们的需求,所以sed也支持更复杂的条件组合。比如我要指定删除第1到6行有Linux字样的内容,那么:#sed'1,6{/Linux/d;}'sed-demo.txtAfterdeletion:2UnixOperatingSystem3RHEL4RedHat5Fedora7CentOS8Debian9Ubuntu10openSUSE删除包含System及其的内容下一行:#sed'/System/{N;d;}'sed-demo.txtAfterdeletion:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE本文转载自微信公众号“良序Linux”,可关注下方二维码。转载本文请联系良旭Linux公众号。