在上一篇文章中,我们讨论了bash 函数以及如何直接从命令行使用它们,我们还看到了其他一些很酷的东西。今天我们将讨论一个方便的字符串操作工具,称为 sed 或 sed Linux 命令。
我们使用 sed 来处理文本文件,如日志文件、配置文件和其他文本文件。
如何使用Linux sed命令?在这篇文章中,我们将重点介绍 sed Linux 命令,包括相关的Linux sed命令用法示例,它用于文本操作,这是我们 bash 脚本编写之旅中必不可少的一步。
Linux系统提供了一些文本处理工具;其中一种工具是Linux sed命令文本操作。
我们将用图片讨论 31+ 个sed命令用法示例,以显示每个示例的输出。
Linux sed命令教程目录
- 了解 sed Linux 命令
- 在命令行中使用多个 sed Linux 命令
- 从文件中读取命令
- 替换标志
- 替换字符
- 限制 sed
- 删除行
- 插入和附加文本
- 修改行
- 变换字符
- 打印行号
- 从文件中读取数据
- 有用的例子
了解 sed Linux 命令
sed 命令是一个非交互式文本编辑器。sed Linux 命令根据你提供的规则编辑数据;你可以这样使用它:
$ sed options file
你不仅限于使用 sed 来操作文件;你可以像这样直接将它应用到STDIN:
$ echo "Welcome to LikeGeeks page" | sed 's/page/website/'

s 命令用第二个文本模式替换第一个文本。在本例中,我们将字符串“website”替换为“page”一词。
上面的示例是演示该工具的简单示例。我们也可以使用 sed Linux 命令来操作文件。
让我们创建一个示例文件:

$ sed 's/test/another test/' ./myfile
结果即时打印到屏幕上;你不必等待处理文件到最后。
如果你的文件足够大,你将在处理完成之前看到结果。
Sed Linux 命令不会更新你的数据。它只将更改后的文本发送到STDOUT。该文件仍然保持不变。如果你需要覆盖现有内容,你可以查看我们之前的帖子,该帖子讨论了重定向。
在命令行中使用多个 sed Linux 命令
如何使用Linux sed命令?要运行多个 sed 命令,你可以使用 -e 选项,如下所示:
$ sed -e 's/This/That/; s/test/another test/' ./myfile

你必须用不带任何空格的分号分隔 sed 命令。
此外,你可以使用单引号来分隔这样的命令:
$ sed -e '
> s/This/That/
> s/test/another test/' myfile

同样的结果,没什么大不了的。
从文件中读取命令
你可以将 sed 命令保存在文件中,并通过使用 -f 选项指定文件来使用它们。
$ cat mycommands
s/This/That/
s/test/another test/
$ sed -f mycommands myfile

Linux sed命令用法示例:替换标志
仔细看下面的例子:
$ cat myfile
$ sed 's/test/another test/' myfile

上面的结果表明我们替换了每行中的第一个出现。要替换所有出现的模式,请使用以下替换标志之一。
我们可以这样写标志:
s/pattern/replacement/flags
有四种类型的替换:
- g、替换所有出现的。
- 一个数字,即要替换的新文本的出现次数。
- p、打印原始内容。
- w file:表示将结果写入文件。
你可以通过指定应替换的出现次数来限制替换,如下所示:
$ sed 's/test/another test/2' myfile

如你所见,我们只替换了每行中的第二个。
g 标志意味着全局,这意味着所有出现的全局替换:
$ sed 's/test/another test/g' myfile

p 标志打印包含模式匹配的每一行,你可以使用 -n 选项仅打印修改后的行。
$ cat myfile
$ sed -n 's/test/another test/p' myfile

w 标志将输出保存到指定的文件:
$ sed 's/test/another test/w output' myfile

我们在屏幕上打印输出,但我们将匹配的行保存到输出文件中。
Linux sed命令教程:替换字符
Linux sed命令文本操作:假设你想使用sed在/etc/passwd文件中搜索bash shell并用csh shell替换它,好吧,你可以很容易地做到:
$ sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
哦!!那看起来很可怕。
幸运的是,还有另一种方法可以实现这一目标。你可以使用感叹号 (!) 作为字符串分隔符,如下所示:
$ sed 's!/bin/bash!/bin/csh!' /etc/passwd
现在更容易阅读了。
如何使用Linux sed命令?限制 sed
sed 命令处理你的整个文件。但是,你可以限制 sed 命令处理特定行;有两种方法:
- 一系列线。
- 匹配特定行的模式。
你可以键入一个数字以将其限制为特定行:
$ sed '2s/test/another test/' myfile

我们只修改了第二行。
使用一系列行怎么样:
$ sed '2,3s/test/another test/' myfile

此外,我们可以从一行开始到文件末尾:
$ sed '2,$s/test/another test/' myfile

或者你可以使用这样的模式:
$ sed '/likegeeks/s/bash/csh/' /etc/passwd

惊人的!!
你可以使用正则表达式来编写此模式,使其更加通用和有用。
删除行
Linux sed命令文本操作:要使用 sed 删除行,你可以使用 delete (d) 标志是你的朋友。
删除标志从流中删除文本,而不是原始文件。
$ sed '2d' myfile

这里我们只从 myfile 中删除第二行。
删除一系列行怎么样?
$ sed '2,3d' myfile

在这里,我们删除了一系列行,第二行和第三行。
另一种类型的范围:
$ sed '3,$d' myfile

这里我们从第三行删除到文件末尾。
所有这些示例都不会修改你的原始文件。
$ sed '/test 1/d' myfile

这里我们使用一个模式来删除第一行匹配的行。
如果你需要删除一系列行,你可以使用如下两种文本模式:
$ sed '/second/,/fourth/d' myfile

我们从第二行删除到第四行。
Linux sed命令用法示例:插入和附加文本
你可以使用以下标志插入或附加文本行:
- (i) 标志。
- (a) 标志。
$ echo "Another test" | sed 'i\First test '

我们在指定行之前添加了文本。
$ echo "Another test" | sed 'a\First test '

我们在指定的行之后添加了文本。
那么,在中间添加文本怎么样?
很简单,看下面的例子:
$ sed '2i\This is the inserted line.' myfile

附加的工作方式相同,但请查看附加文本的位置:
$ sed '2a\This is the appended line.' myfile

我们使用了相同的标志,但有一个插入或附加的位置。
修改行
要修改特定行,你可以使用 (c) 标志,如下所示:
$ sed '3c\This is a modified line.' myfile

你可以使用正则表达式模式,所有匹配该模式的行都将被修改。
$ sed '/This is/c Line updated.' myfile

变换字符
变换标志 (y) 对这样的字符起作用:
$ sed 'y/123/567/' myfile

我们将转换应用于所有数据,我们不能将其限制为特定事件。
打印行号
你可以使用 (=) 符号打印行号,如下所示:
$ sed '=' myfile

但是,通过将 -n 与等号结合使用,sed 命令会显示包含匹配项的行号。
$ sed -n '/test/=' myfile

Linux sed命令文本操作:从文件中读取数据
你可以使用 (r) 标志从文件中读取数据。
你可以为要阅读的文本定义行号或文本模式。
$ cat newfile
$ sed '3r newfile' myfile

我们按预期在第三行之后插入了内容。
这是使用文本模式:
$ sed '/test/r newfile' myfile

酷吧?
如何使用Linux sed命令?有用的例子
假设我们有一个包含带有占位符的文本的文件,并且我们有另一个文件包含将填充另一个文件上的占位符的数据。
我们将使用 (r) 和 (d) 标志来完成这项工作。
Linux sed命令教程:该文件中的单词 DATA 是真实内容的占位符,我们将存储在另一个名为 data 的文件中。
我们将用实际内容替换它:
$ Sed '/DATA>/ {
r newfile
d}' myfile

惊人的!!如你所见,我们用另一个文件中的数据填充了占位符位置。
Linux sed命令文本操作:这只是关于 sed 命令的一个小介绍。sed Linux 命令本身就是另一个世界。
唯一的限制是你的想象力。
我希望你发现使用 sed Linux 命令操作字符串很容易,希望以上的Linux sed命令用法示例可以帮助到你,若有任何问题,请在下方评论。
谢谢阅读。