sed命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed命令相关的知识,希望对你有一定的参考价值。

1.sed命令

sed是一个非交互式的文本编辑器,可以对文本文件以及标准输出进行编辑。

sed命令会将文件或标准输出中一次选取一行数据,复制进缓冲区,然后读取编辑的子命令,对行进文本行编辑,重复此过程,直到所有的文本行处理完毕。

sed命令编辑的文件是原始文件的副本,因此编辑操作并不影响原文件,只输出到屏幕,如果想保存,就重定向到磁盘文件即可。



2.sed命令的使用方法

语法:

sed [选项] [脚本] [输入文件]


选项:

-n:取消默认输出。只显示特殊处理的行。

-e:运行执行多个脚本

-f:后面跟脚本名,从脚本中读取命令

-i:直接修改原始文件。

-I:大写i,不区分大小写。

-l:指定行的长度。

-r:在脚本中使用扩展正则表达式。

-s:默认情况下,sed会把命令行指定的多个文件名作为一个长的连续的输入流。而GNU sed则允许把他们当作单独的文件,这样的话,正则表达式不进行跨文件匹配。

-u:最低限度的缓存输入与输出。


脚本:

用户可以将一系列的sed命令写在一个脚本文件中,sed会从该文件中读取并依次执行各个命令。


输出文件:

表示输入文件,没有指定输入文件,则从标准输入中读取。


三种工作方式:

1.在命令行直接执行sed命令。sed [选项] [命令] [提供数据的文件]

2.将sed的操作写入脚本,通过-f指定脚本。sed [选项]  -f [脚本] [提供数据的文件]

3.将sed写入脚本,解释器为 #! /bin/sed。./scrpt [提供数据的文件]


定位文本行:

表示方式

意义

例子

x

x为整数,表示第几行。

例定位到第10行,则使用10

x,y

定位到连续的行,x行起始,y行结束。

例定位2-5行。则 2,5

x~s

起始行和步长,x行起始,s为步长

例定位偶数行,则0~2

$

表示定位最后一行。

例最后一行$,第一行就是1

x,+n

表示从x行开始,以后后面n行

例从第2行以及后面5行,则 2,+5


正则表达式定位文本行:语法是  /regexp/

正则

意义

/一般字符/

匹配字符本身,例如 /abc/ 就是匹配包含abc的行

*

表示前面一个字符重复0次或多次。例如 /a*/ 就是a出现0次或多次

\+

表示前面的一个字符出现1次或多次。扩展正则表达式

\?

表示前面的一个字符出现0次或1次

\{x\}

表示前面一个字符出现x次,例如 /a\{3\}/ 匹配 aaa

\{x,y\}

表示前面一个字符出现x次到y次。例 /a\{1,2\}/ 匹配a或者aa

\{x,\}

表示前面一个字符至少出现x次。

.

匹配任意字符

^

匹配行首字符,例 ^aa  则匹配aa开头的行

$

匹配行尾字符,例 aa$ 则匹配aa结尾的行

[]

匹配中括号内的任意字符

[^]

匹配中括号内不出现的字符

\n

匹配换行符



3.sed的常用操作以及使用方法

3.1 sed编辑命令的基本语法-总的语法

语法:

[位置参数1[,位置参数2]]  子命令 [子命令参数]


介绍:

位置参数:可以用行号或者正则来表示。指定了位置参数,对匹配的行进行操作。没有指定位置参数对全部的内容进行操作。

子命令:sed提供的子命令,用来实现编辑操作。

子命令参数:子命令的参数。


子命令:

p:将缓存区的文本行输出出来。

s:替换命令。可以通过标志决定替换的模式,g:全局。十进制数字:第几个。p:第一个并输出。w:第一个并输出到磁盘。空:替换第一个。

d:删除文本。

a:在匹配的行的下面另起一行追加内容。

i:在匹配的行的上面另起一行追加内容。


3.2 选择文本 p

子命令p可以把位置参数筛选出来的参数,显示出来。。语法如下:

[位置参数1[,位置参数2]]  p


实例:

1.行定位的方法,显示文本行。

显示文件的1~3行,不使用-n选项。

# sed 1,3p 1.txt

eeee

eeee

asdada

asdada

adadas

adadas

adsASQWE

SGDFGE


只显示文件的1~3行,使用-n选项。

# sed -n 1,3p 1.txt

eeee

asdada

adadas


2.正则定位的方法,显示文本行。

显示包含dada的行

# sed -n '/dada/p'  1.txt

asdada

adadas


3.3 替换文本 s

s子命令可以对文本进行替换。

[位置参数1[,位置参数2]]  s/匹配字符/替换字符/[标志]


标志:

g:全局匹配,会替换文本行中的所有符合规则的字符串。

十进制数字:数字为n,则替换第n个符合规则的字符串。

p:替换第一个,并输出到标准输出。

w:替换第一个,并输出到磁盘文件中。

空:不加标志,则替换第一个。


实例:

1.替换文件的内容。

把文件的a替换成大写A。

# sed  's/a/A/g' 1.txt  

eeee

AsdAdA

AdAdAs

AdsASQWE


2.对指定的行进行替换。

把文件1~3行的a替换成A。

# sed '1,3  s/a/A/g' 1.txt      

eeee

AsdAdA

AdAdAs

adsASQWE


3.4 删除文本 d

子命令d可以实现文本行删除。语法如下:

[位置参数1[,位置参数2]]  d


实例:

1.删除文件的行

删除文件的第一行

# sed '1d' 1.txt

asdada

adadas

adsASQWE


删除文件的最后一行

# sed '$d' 1.txt


删除空白行

# sed '/^$/d' 1.txt  


3.5 追加文本 a

在匹配到的行的下面插入文本。

[位置参数1]  a  文本


实例:

在passwd文件 root 开头的行的后面插入一行aaaaaaaaa

# sed '/^root/ a aaaaaaaaaaaaaaaaaaa' passwd

root:x:0:0:root:/root:/bin/bash

aaaaaaaaaaaaaaaaaaa

bin:x:1:1:bin:/bin:/sbin/nologin

daemon:x:2:2:daemon:/sbin:/sbin/nologin


3.6 插入文本 i

在匹配到的行的上面插入文本。

[位置参数1]  i  文本


实例:

在passwd文件 root 开头的行的上面插入一行aaaaaaaaa

# sed '/^root/ i aaaaaaaaaaaaaaaaaaa' passwd

aaaaaaaaaaaaaaaaaaa

root:x:0:0:root:/root:/bin/bash

bin:x:1:1:bin:/bin:/sbin/nologin


3.7 调换位置 ()

例如调换passwd文件第一列和最后一列的位置。可以使用sed,语法如下:

sed -r 's/(表达式1):(表达式2):(表达式3)/\3\2\1/' [文件/数据流]


实例1:

调换passwd文件第一列和最后一列的位置

# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/'  passwd

/bin/bash:x:0:0:root:/root:root

/sbin/nologin:x:1:1:bin:/bin:bin

/sbin/nologin:x:2:2:daemon:/sbin:daemon


解释:

([^:]+):(.*):([^:]+):根据顺序,每一个小括号都在以后变换位置的时候,分别对应 123。

([^:]+)::匹配不是冒号的字符一个或多个然后分隔符是冒号。匹配到的是第一段。

(.*)::匹配任意个任意字符,到冒号结束。也就是匹配第一个冒号和最后一个冒号之间的部分。

([^:]+):匹配的不是冒号的字符一个或多个。也就是匹配了最后一段。

\3:\2:\1:123分别表示三个括号的内容,使用\3\2\1表示重新排列。:即分割符。


实例2:

在passwd文件的最前面插入一段。

# sed -r 's/(.*)/aaa:&/' passwd

aaa:root:x:0:0:root:/root:/bin/bash

aaa:bin:x:1:1:bin:/bin:/sbin/nologin

aaa:daemon:x:2:2:daemon:/sbin:/sbin/nologin


解释:

(.*):可以匹配整个行,用小括号括起来是为了用数字调用。

aaa:&:aaa:是插入的内容。&表示括号的内容。也可以用 转义1(\1)表示。


实例3:

把文件中的4段倒叙排列。

# cat 1.txt

111:222:333:444

# sed -r 's/(.*):(.*):(.*):(.*)/\4:\3:\2:\1/' 1.txt  

# sed -r 's/(.*):(.*):(.*):([^:]+)/\4:\3:\2:\1/' 1.txt

444:333:222:111



4. 组合命令

sed支持多个子命令组合一起用。对文本进行多个不同的操作,使用-e选项可以在一条sed命令中完成这些操作。


4.1 使用-e执行多个子命令

可以将sed后面的多个子命令使用-e链接起来。

# sed -e '/^1111$/ a 2222' -e '/^1111$/ i 0000' 2.txt

0000

1111

2222

3333


4.2 使用;分号执行多个子命令

# sed -n -e 's/a/A/g ; 1,3p' 1.txt

eeee

AsdAdA

AdAdAs


4.3对一个地址使用多个子命令

如果对一个文件指定的行进行很多次操作, sed命令提供了对同一个地址使用多次子命令的语法。如下:

位置参数 {

子命令1

子命令2

子命令3

...

}

也可以写在一行

位置参数 {子命令1;子命令2;子命令3;...}


实例:

对 1.txt 的1~5行,进行2次替换,和一次插入。

# sed -n '1,5 {

>s/a/A/g

> s/b/B/g

> 2 i 20180425

> p

> }' 1.txt


4.4 sed脚本

还可以把sed脚本写在脚本里。脚本里的特殊字符需要转义。格式如下:

sed -f 脚本 [文件/数据流]


实例:

就是把子命令一行一行的写在脚本里,然后通过-f指定脚本文件即可。

# vim 1.sed

s/a/A/g

s/b/B/g

2 i 20180425


# sed -f 1.sed 1.txt

eeee

20180425

AsdAdA

AdAdAs

AdsASQWE

SGDFGE

XVCZS

dsgfsd

dfsd


以上是关于sed命令的主要内容,如果未能解决你的问题,请参考以下文章

sed命令详解

如何在Unix下使用sed命令

关于Linux里的sed命令。

Linux学习笔记2(sed命令)

linux之文本内容替换命令sed

sed命令