Ubuntu小技巧14--sed命令详解

1 sed 简介

Sed是一个简化的非交互式编辑器,它是linux下三大文本处理工具之一(另外两个为grep awk)。 它允许你执行可在vi和ex编辑器使用的相同类型的编辑任务。 sed程序并不是与编辑器交互工作,而是在命令行键入编辑命令、命名文件,然后在屏幕上查看编辑命令的输出。 sed编辑器是非破坏性的,除非使用shell重定向保存输出,否则它不会更改执行操作的文件。 默认情况下,所有行都打印在屏幕上。

工作模式:

sed编辑器一次处理一行文件(或输入)并将其输出发送到屏幕。 它的相关命令我们可以从vi和ed/ex编辑器看到一些类似的用法。 Sed将当前正在处理的行存储在称为模式空间或临时缓冲区的临时缓冲区中,一旦sed完成对模式空间中行的处理(即,在该行上执行sed命令),模式空间中的行就会被输出到屏幕(除非命令是删除行或禁止其打印)。 处理完行后,将其从模式空间中删除,然后将下一行读入模式空间中进行处理并显示。 当处理完输入文件的最后一行时,Sed就结束了。 Sed通过将每一行存储在临时缓冲区中并在该行上执行编辑,该方法使得原始文件永远不会被更改或销毁。其原理如下图所示:

Ubuntu小技巧14--sed命令详解_shell


使用格式:sed [OPTION]… {script-only-if-no-other-script} [input-file]…

与grep一样,Sed可以使用正则表达式来完成文本处理,正则表达式是用正斜杠包含的字符模式,主要用于搜索和替换。
方法:sed -n ‘/RE/p’ filename
示例1.1:sed -n ‘/love/p’ datafile
说明:输出包含love的行,注意此处p表示输出,不可缺少

方法:sed -n ‘s/RE/replacement string/p’ filename
示例1.2:sed -n ‘s/love/like/p’ datafile
说明:将包含love的行替换为like,注意此处的s不可少,缺少p后无输出

2 正则表达式通配符

以下为sed中常用正则的标志和功能,以及案例说明:

Metacharacter

Function

Example

What It Matches

^

起始行

/^love/

匹配所有以love开头的行

$

结尾行

/love$/

匹配所有以love结尾的行

.

匹配一个字符,单不是换行符

/l…e/

匹配包括Ixxe的所有行,xx为任意两个字符

*

匹配0或者多个字符

/ *love/

匹配包含0或者多个字符的行,且结尾为love,注意: *love 中 *前面有个空格

[ ]

匹配一个在集合中的字符

/[Ll]ove/

匹配到包括Love或者love的行

[^ ]

匹配一个字符不在集合中

/[^A–KM–Z]ove/

匹配不包括A-K和MZ切接着为ove的行

(…)

保存匹配到的字符

s/(love)able/\1er/

标记部分内容到tag1中(最多有9个tag),以便于后续使用,例如此处将love标记为tag1,后续可以通过\1来表示love;将loveable替换为lover,其中\1即为love

&

保存搜索的字符串,以便于在替换的时候使用

s/love/**&**/

保存love, 将 love 替换为 **love**.

<

匹配以某个单词开头

/<love/

匹配到包含 一个单词以love开头的行

>

匹配以某个单词结尾

/love>/

匹配到包含 一个单词以love结尾的行

x{m}

x{m,}

x{m,n}

连续重复字符x m次

连续重复字符x 至少m次

连续重复字符x m-n次

/o{5}/

/o{5,}/

/o{5,10}/

匹配到 连续出现5次o的行

匹配到 连续出现至少5次o的行

匹配到 连续出现5-10次o的行


3 命令选项

3.1 命令

Command

Function

a\

追加1或者多行文本到当前行

c\

使用新的文本内容替换当前行

d

删除行

i\

在当前行之前插入文本

h

将模式空间的内容复制到缓存空间

H

将模式空间的内容追加到缓存空间

g

获取缓存空间的内容,并将其复制到模式空间(覆盖模式空间的内容)

G

获取缓存空间的内容,并将其复制到模式空间(追加到模式空间)

l

列出非打印字符

p

按行输出

n

读取下一行,并且用n对应命令处理新行内容(而不是用老方法处理新行内容)

q

退出sed命令

r

从文件读出多行数据

!

除选择的内容外,应用该命令到所有的行

s

替换字符串

Substitution Flags

g

在行上进行全局替换(默认替换只进行一行,加了g后可以对所有行进行替换)

p

输出选中行对应的数据

w

将匹配的行写到指定文件中

x

交换缓存空间和模式空间中的内容

y

转换一个字符为另外一个字符,例如 y/ab/AB 将a转为A,b转为B(cannot use regular expression metacharacters with y)

示例3.1.1 :sed ‘2,5d’ myfile
说明:删除2-5行数据,即输出不包含2-5行的所有数据

3.2 选项

Options

Function

–e

增加一个可执行的脚本

–f

将脚本的内容添加到要执行的命令

–n

禁止默认输出

-n 和p结合可以输出;单独-n无p就没有输出;
示例3.2.1:sed -n -f f.txt datafile
其中,f.txt 内容为 /dog$/p,其等价为sed -n ‘/dog$/p’ datafile
说明:输出以dog结尾的行。

3.3 举例

datafile内容:

northwest   NW  Charles Main        3.0 .98 3   34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

示例3.3.1: sed ‘/north/p’ datafile
说明:逐行输出所有内容,包含该north的会重复输出
结果:

northwest   NW  Charles Main        3.0 .98 3   34
northwest NW Charles Main 3.0 .98 3 34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

示例3.3.2: sed -n ‘/north/p’ datafile
说明:只输出包含该north的行
结果:

northwest   NW  Charles Main        3.0 .98 3   34
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9

示例3.3.3: sed ‘3d’ datafile
说明: 删除第3行
示例3.3.4: sed ‘3,$d’ datafile
说明:从第3行开始全部删除
结果:

northwest   NW  Charles Main        3.0 .98 3   34
western WE Sharon Gray 5.3 .97 5 23

示例3.3.5: sed ‘$d’ datafile
说明: 删除最后一行
示例3.3.6: sed ‘/[WSN]E/d’ datafile
说明: 删除匹配到WE|SE|NE的行
结果:

northwest   NW  Charles Main        3.0 .98 3   34
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
eastern EA TB Savage 4.4 .84 5 20
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

示例3.3.7: sed -n ‘s/^west/north/p’ datafile
说明:匹配到west开头的行,并将west替换为north,然后输出
结果:

northern     WE  Sharon  Gray        5.3 .97 5   23

示例3.3.8: sed ‘s/[0-9][5-9]$/&.5/’ datafile
说明:匹配最后两个为数组,切最后一个在5-9之间的,在这样的行后追加 .5
结果:

northwest   NW  Charles Main        3.0 .98 3   34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18.5
southern SO Suan Chin 5.1 .95 4 15.5
southeast SE Patricia Hemenway 4.0 .7 4 17.5
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

示例3.3.9: sed ‘s/3/88/g’ datafile 等价 sed ‘s#3#88#g’ datafile
说明: 将所有的3替换为88
示例:3.3.10: sed ‘s/3/88/’ datafile 等价 sed ‘s#3#88#’ datafile
说明: 将最后一个3替换为88
示例3.3.11: sed -n ‘5,/^eastern/p’ datafile
说明: 从第5行开始输出,知道出现的第一个eastern的那一行为止,若一直没有easter则从第5行开始全部输出
结果:

southeast   SE  Patricia Hemenway   4.0 .7  4   17
eastern EA TB Savage 4.4 .84 5 20

示例3.3.12: sed -e ‘1,7d’ -e ‘s/Ann/Bnn/’ datafile
说明: 删除1-7行,然后将Ann替换为Bnn,-e表示可以使用多次规则
结果:

north       NO  Margot  Weber       4.5 .89 5   9
central CT Bnn Stephens 5.7 .94 5 13

示例3.3.13: sed ‘/Suan/r newfile’ datafile
说明:读出newfile中的内容,匹配到Suan后将其追加到Suan所在的行后面
示例3.3.14: sed -n ‘/north/w newfile’ datafile
说明: 将匹配到north的行全部输出到newfile中
示例3.3.15: sed '/^north /a\ This is function of a\ ’ datafile
说明: 匹配到north 开头的行,并追加This is function of a
结果:

northwest   NW  Charles Main        3.0 .98 3   34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE AM Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
This is function of a\
central CT Ann Stephens 5.7 .94 5 13

示例3.3.16: sed ‘1,3y/abcdef/ABCDEF/’ datafile
说明: 将 1-3行的abcdef 由小写替换为大写
示例3.3.17: sed ‘/eastern/{ n; s/AM/Archie/; }’ datafile
说明:匹配到eastern后立马处理下一行, 下一行的处理方法为: 将Archie替换为AM
结果:

northwest   NW  Charles Main        3.0 .98 3   34
western WE Sharon Gray 5.3 .97 5 23
southwest SW Lewis Dalsass 2.7 .8 2 18
southern SO Suan Chin 5.1 .95 4 15
southeast SE Patricia Hemenway 4.0 .7 4 17
eastern EA TB Savage 4.4 .84 5 20
northeast NE Archie Main Jr. 5.1 .94 3 13
north NO Margot Weber 4.5 .89 5 9
central CT Ann Stephens 5.7 .94 5 13

待添加…

4 使用案例及注意事项

4.1 使用案例

后续将在此处逐渐补充一些常用的案例。

  1. 将脚本中sdx1 替换为sdw1
    sed ‘s/sdx1/sdw1/’ -i keeprunning/disk5_keeprunning_v2.sh
    此处需要使用-i,其作用为替换后将内容写回到脚本disk5_keeprunning_v2.sh中;

4.2 注意事项

  1. 通过\c正则内容c 的方式
    方法:sed -n ‘\cREcp’ filename
    说明:其中\c c即为正则表达的起始标志,等价于/ /
    示例4.2.1:sed -n ‘\cdog$cp’ datafile 和 sed -n ‘/dog$/p’ datafile
    说明:\c c 和\ \等价,都是输出以dog结尾的行。
  2. sed ‘s/dog/123/’ datafile 、 sed ‘s/dog/123/p’ datafile 和 sed -n ‘s/dog/123/p’ datafile 的区别
    第一个不会重复全输出,
    第二个全部输出,但是包含dog的行会重复,
    最后一个不重复且只输出包含dog的行;
  3. sed 中使用变量
vim set_params.sh
sed -i "s/build_docker_env/$3/g" -i ./shell_paras.txt
该方法将 shell_paras.txt 中的 build_docker_env 替换为$3

使用变量的试试需要使用双引号,否则变量$3不生效

5 说明

测试系统版本:Ubuntu 1910 SERVER (64-bit)
参考文献: UNIX® Shells by Example Fourth Edition By Ellie Quigley