我们大家都知道,在 vim 中删除文件中的某几行很简单,只需要按下 dd 键即可。那么,在不主动打开文件的情况下,通过命令行怎样删除文件中特定的某行呢?
使用像 rm 这样的命令,会删除整个文件,但我们并不希望这样做。使用 vim 或者 nano 这样的文本编辑器,并不适用于 bash 脚本的自动化。
合适的方案,是使用 sed 命令,它可以在 shell 脚本中使用。
我们今天将介绍几种使用的场景和例子。
注意,我们介绍的例子会修改原始文件,所以如果大家在平时使用或者练习的时候,最好先做好备份。
从文件中删除某一行
假如我们要删除文件中的第7行,那么可以这样使用 sed 命令:
我们来解释一下上述命令:
- -i:该选项启用在位编辑(in-place editing)。默认情况下,sed 只显示输出,使用 -i 选项,它修改实际文件,但是不在显示其中显示;
- 7d:这里 7 是行号,d 指删除该行;
- filename:要修改的文件,如果文件位于其他目录中,可以提供绝对或相对路径。
我们举个实际的例子,假如有一个名为 tiap.txt 的文件,其内容为:
删除第4行:
上述命令将会删除 Giant's Bread 这一行,如下为结果:
接下来,我们删除第一行:
注意:如果希望在不修改文件本身的情况下查看操作结果,请不要使用 -i 选项。
使用 sed 删除最后一行
上文我们介绍了删除特定的某一行,那么怎样删除最后一行呢?
有一种方法是使用 wc 命令来获取文件中的总行数,然后结合 sed 使用。不过,sed 提供了一个专门的方法来删除文件的最后一行,所以我们不需要再获取文件的总行数了。
删除多行
与前面介绍的类似,还可以删除文件中的多行。比如,我们要删除文件中的第11行至第15行,那么可以这样:
上述命令会从文件中删除包括第11行到第15行的内容。
删除包含某字符串的行
使用 sed 命令还可以删除包含给定字符串或与特定模式匹配的所有行。
下面的命令将删除包含单词“string”的所有行:
注意,上述字符串是区分大小写的。此外,还可以使用正则表达式来代替字符串。
删除以某个单词开头的行
如果要删除以特定单词或字母开头的所有行,只需提供如下正则表达式:
删除所有空行
我们今天介绍的最后一个例子,是删除文件中所有的空白行:
关于 sed 命令,它的使用方法还有很多,大家有兴趣可以查看一下 man 手册。后续我们也会再单独介绍一下。
以上就是本次分享全部内容,欢迎讨论。