sed命令格式

下面显示了 sed 命令的语法:

# sed [options] 'action [args]' files [ > outfile]

sed 编辑器能够使用正则表达式语法执行文本模式替换和文本模式删除。
这些与 grep 使用的正则表达式字符相同。

sed 命令提供的功能是交互式文本编辑的扩展。
如果我们需要在大量文件中搜索和替换文本字符串,sed 是最有用的。

欢迎来到之路教程(on itroad-com)

使用 sed 打印文本

示例 1:打印行范围

以下示例显示了 p(打印)命令的使用,该命令将一系列行打印到标准输出。
范围由起始地址、逗号和结束地址指定。
sed 的默认输出是它读取的每一行。
要禁止默认输出,请使用 -n 选项。

# sed -n '3,5p' data.txt 
southwest       SW      Chris Foster        33
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       3

示例 2:打印包含特定图案的行

以下命令打印所有带有模式 west 的行。
使用正斜杠 (/) 分隔正则表达式。

# sed -n '/west/p' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        33

示例 3 :具有多个图案的印刷线

以下命令打印包含模式 west 的第一行,直到并包括包含模式 south 的下一行。

# sed -n '/west/,/southern/p' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        33
southern        SO      Jan Chin            45

示例 4:打印带有图案的行和之后的所有行

以下命令打印包含模式 Chris 的第一行,直到文件的最后一行。

# sed -n '/Chris/,$p' data.txt 
southwest       SW      Chris Foster        33
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       3
eastern         EA      Susan Beal          34
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

示例 5:类似于 grep 的功能

该模式可能包含 grep 使用的正则表达式字符。
以下示例打印所有以 s 开头并以 5 结尾的行。

# sed -n '/^s.*5$/p' data.txt 
southern        SO      Jan Chin            45

添加 sed 功能 - 编辑命令

下表显示了其他 sed 编辑器命令。

命令功能
a附加文本
c用新文本更改当前行中的文本
i在当前行上方插入文本

sed 编辑器简介

术语 sed 代表流编辑器。
Sed 可以从标准输入获取其输入,在流上应用请求的编辑,并自动将结果放入标准输出。
sed 语法允许在命令行上指定输入文件。

我们不需要在 sed 编辑器运行时与它进行交互;因此,它也被称为批处理编辑器。
这与 vi 和 ed 等交互式编辑器形成对比。
因为 sed 不需要交互,所以我们可以将 sed 命令放在脚本中。
我们可以调用脚本文件并针对数据文件运行它以执行重复的编辑操作。

使用 sed 替换文本

Command例子编辑动作
ssed s/x/y/选项搜索和替换。 搜索模式 x 替换为模式 y。 搜索和替换模式在大多数情况下是正则表达式,并且可以通过各种选项影响搜索和替换行为。
ysed y/abc/xyz/将源字符集中的每个字符替换为目标字符集中具有相同位置的字符。

示例 1:搜索和替换特定模式

sed s 命令允许对文本进行搜索和替换操作。
该命令使用模式搜索和文字字符串替换。
替换字符串字符按字面意思进行,没有元字符扩展。

# sed 's/3/X/' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        X3
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       X
eastern         EA      Susan Beal          X4
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

sed 命令检查文件的每一行,并用新字符串替换第一次出现的旧字符串。
同一行中旧字符串的后续出现保持不变。

示例 2:全局搜索和替换特定模式

以下示例显示了 g(全局)命令和 s(搜索和替换)命令,它用新字符串替换所有出现的旧字符串。

# sed 's/3/X/g' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        XX
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       X
eastern         EA      Susan Beal          X4
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

示例 3:使用替换中包含的搜索模式进行搜索和替换

有时,通过搜索和替换,旧字符串将成为新替换字符串的一部分,我们可以通过在替换字符串中放置 &(与号)来实现这一点。
& 的位置决定了旧字符串在替换字符串中的位置。

以下示例的目的是编写一个命令,该命令搜索最后一个字段中以一位数字结尾的所有行,并将一位数字替换为一位数字加上字符串 Single Doirt。

要正确识别最后一个字段中具有一位数的行,请考虑以下 sed 命令。
制表符将每一行的字段分开。

sed -n '/    [0-9]$/p' data.txt 
southeast       SE      Derek Johnson       3

以下命令搜索在最后一个字段中以一位数字结尾的所有行,并将一位数字替换为一位数字加上字符串 Single Doirt。

# sed 's/    [0-9]$/& Single Doirt/' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        33
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       3 Single Doirt
eastern         EA      Susan Beal          34
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

使用 sed 删除文本

示例 1:删除一系列行

以下命令从输出中删除第 4 行到第 8 行。

# sed '4,8d' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
southwest       SW      Chris Foster        33
central         CT      Sheri Watson        44

示例 2:删除包含特定模式的行

以下命令删除任何包含模式 west 的行。

# sed '/west/d' data.txt 
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       3
eastern         EA      Susan Beal          34
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

示例 3

以下命令删除任何以模式 west 开头的行。

# sed '/^west/d' data.txt 
northwest       NW      oirl Craig          10
southwest       SW      Chris Foster        33
southern        SO      Jan Chin            45
southeast       SE      Derek Johnson       3
eastern         EA      Susan Beal          34
northeast       NE      TJ Nichols          67
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

示例 4

以下命令删除从包含模式向南的第一行开始,一直到包含北部的文件的下一行的行范围。

# sed '/south/,/north/d' data.txt 
northwest       NW      oirl Craig          10
western         WE      Sharon Kelly        40
north           NO      Val Shultz          91
central         CT      Sheri Watson        44

在单个 sed 命令中放置多个编辑

有时我们想对文件执行多次编辑。
我们可以使用 -e 选项将编辑放在同一命令行中,而不是使用多个 sed 命令。
编辑按我们指定的顺序执行。

示例 1

删除行必须非常小心。
我们可以对一行文本执行编辑,然后从输出中删除该行文本。
这发生在以下示例中,输入文件的第 1 行。

# sed -e 's/north/North/' -e '1,4d' data.txt 
southeast       SE      Derek Johnson       3
eastern         EA      Susan Beal          34
Northeast       NE      TJ Nichols          67
North           NO      Val Shultz          91
central         CT      Sheri Watson        44

编辑命令

sed 编辑器使用的编辑命令(如表所示)与用于 vi 和 ed 的编辑命令类似。

命令功能
d删除行
p打印行
r读取文件
s用一个字符串替换另一个
w写入文件

sed 命令有两个选项:

选项功能
-n抑制默认输出
-f从脚本文件中读取 sed 命令
sed 编辑器示例

示例中使用的示例数据

以下示例针对名为“data.txt”的文件执行 sed 命令。
文件data.txt的内容如下。

# cat data.txt
northwest	NW	oirl Craig	    10
western  	WE	Sharon Kelly	40
southwest	SW	Chris Foster	33
southern 	SO	Jan Chin	    45
southeast	SE	Derek Johnson	3
eastern  	EA	Susan Beal	    34
northeast	NE	TJ Nichols	    67
north    	NO	Val Shultz	    91
central  	CT	Sheri Watson	44
日期:2020-09-17 00:14:02 来源:oir作者:oir