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 [提供数据的文件]
定位文本行:
正则表达式定位文本行:语法是 /regexp/
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命令的主要内容,如果未能解决你的问题,请参考以下文章