当前位置: 首页 > Linux

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

时间:2023-04-06 18:25:30 Linux

使用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.txt删除后:2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE很简单正确的?我不会在这里解释太多。如果要删除前几行的内容,只需要在命令中替换1就可以了。问题是,最后一行用的是什么数字?这里给大家一个小提示,可以用美元符号$表示结束,所以删除最后一行的命令可以这样写:#sed'$d'sed-demo.txtAfterdeletion:1LinuxOperatingSystem2Unix操作系统3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu2。删除一些行sed命令可以删除连续的或不连续的行。删除连续的行,例如删除5到7行的内容:#sed'5,7d'sed-demo.txt删除后:1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat8Debian9Ubuntu10openSUSE删除不连续的行,例如,删除第1、5、9和最后一行:#sed'1d;5d;9d;$d'sed-demo.txt删除后:2Unix操作系统3RHEL4RedHat6ArchLinux7CentOS8Debian此外,它适用于逻辑否定!使用,例如,删除第3到6行以外的行:#sed'3,6!d'sed-demo.txt删除后:3RHEL4RedHat5Fedora6ArchLinux3。删除空行sed也支持删除文件的空行,命令如下:#sed'/^$/d'sed-demo.txt删除后:1LinuxOperatingSystem2UnixOperatingSystem3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE提示:这里表达式里面的两个斜杠//起到了文本匹配的作用,可以参考正则表达式的使用。下面将列出一些常用的方法来加深您的学习。4.删除包含特定字符的行假设我们要删除示例文件中包含单词System的行内容,我们可以使用/System/,表示将匹配字符串System,具体命令如下:#sed'/System/d'sed-demo.txt删除后:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE不仅如此,我们还可以添加一个逻辑条件,例如下面的命令:#sed'/System\|linux/d'sed-demo.txt删除后:3RHEL4RedHat5Fedora7CentOS8Debian9Ubuntu10openSUSE反斜杠\代表逻辑或。上述命令的意思是必须删除文中包含System或Linux的行。5.删除以特定字符开头的行首先,为了更好的演示,我们再创建一个示例文件sed-demo-1.txt,其内容如下:#catsed-demo-1.txt删除后:Linux操作系统Unix操作系统RHELRedHatFedoradebianubuntuArchLinux-12-Manjaro3456上面说了$符号可以理解为结束,那么有没有什么字符可以代表开始呢?答案是肯定的,这里我们可以用^号来表示开头。那么,当我们要删除以某个字符开头的行时,比如删除以R开头的行,可以使用如下命令:#sed'/^R/d'sed-demo-1.txt删除后:LinuxOperatingSystemUnixOperatingSystemFedoradebianubuntuArchLinux-12-Manjaro3456那么问题来了,比如我要删除R或者F开头的行,是不是要执行两次命令?如果多了,岂不是要执行多条命令?这里有一个简单的写法,你只需要将这些字符写在一对方括号[]中:#sed'/^[RF]/d'sed-demo-1.txt删除后:LinuxOperatingSystemUnixOperatingSystemdebianubuntuArchLinux-12-Manjaro3456上述命令的作用是删除以R或F开头的行。6.删除以特定字符结尾的行同上,删除以特定字符结尾的行,例如,删除以m结尾的行,我们可以这样做:#sed'/m$/d'sed-demo.txt删除后:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE删除以x或m结尾的行可以这样写:#sed'/[xm]$/d'sed-demo.txt删除后:3RHEL4RedHat5Fedora7CentOS8Debian9Ubuntu10openSUSE7。删除大写字母开头的行问题又来了,如果我想删除所有大写字母开头的行怎么办?按照上面的方法,是不是要把A到Z的26个字母全部写进[]?其实我们不用这么做,只需要在A和Z之间加一个-即可:#sed'/^[A-Z]/d'sed-demo-1.txt删除后:debianubuntu2-Manjaro3456YouseeYou看到这里肯定会想到其他类似的用法,下面看看有没有你想到的命令。8.删除包含字母字符的行#sed'/[A-Za-z]/d'sed-demo-1.txt删除后:34569.删除包含数字的行#sed'/[0-9]/d'sed-demo-1.txt删除后:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntu另外,在这个例子中,我们可以添加^和$以更好地看出三者之间的区别:#sed'/^[0-9]/d'sed-demo-1.txt删除后:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntuArchLinux-1#sed'/[0-9]$/d'sed-demo-1.txt删除后:LinuxOperatingSystemUnixOperatingSystemRHELRedHatFedoradebianubuntu2-Manjaro10。更多其实我们要删除的文件内容比较具体,简单的条件不能满足我们的需求。因此,sed也支持更复杂的条件组合。比如我要指定删除第1到6行有Linux字样的内容,那么:#sed'1,6{/Linux/d;}'sed-demo.txt删除后:2UnixOperatingSystem3RHEL4RedHat5Fedora7CentOS8Debian9Ubuntu10openSUSE删除包含System的内容及其下一行:#sed'/System/{N;d;}'sed-demo.txt删除后:3RHEL4RedHat5Fedora6ArchLinux7CentOS8Debian9Ubuntu10openSUSE最后,最近有很多朋友要一份Linux学习路线图,于是结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站