乐趣区

关于linux:每天一个-Linux-命令3sed

举荐: 每天一个 Linux 命令(2):od

性能简介

sed 是一种流编辑器,也是文本处理中十分好的工具,配合正则应用更弱小解决时,把以后解决的行存储在长期缓冲区中,称为“模式空间”,接着用 sed 命令解决缓冲区的内容,实现后输入到屏幕,接着解决下一行。文件内容并没有扭转,除非应用 - i 选项。sed 次要用来编辑一个或多个文件,简化对文件的重复操作或者用来编写转换程序等。

sed 性能同 awk 相似,差异在于,sed 简略,对列解决的性能要差一些,awk 性能简单,对列解决的性能比拟弱小。

命令格局

 sed [options] 'command' file(s)
 sed [options] -f scriptfile file(s)

罕用参数

-e #以指定的指令来解决输出的文本文件
-n #勾销默认输入(如果和 p 命令同时应用只会打印产生扭转的行)-h #帮忙
-V #显示版本信息

罕用动作

a #在以后行上面插入文本
i #在以后行下面插入文本
c #把选定的行改为新的文本
d #删除,删除抉择的行
D #删除模板块的第一行 
s #替换指定字符
h #拷贝模板块的内容到内存中的缓冲区
H #追加模板块的内容到内存中的缓冲区
g #取得内存缓冲区的内容,并代替以后模板块中的文本 
G #取得内存缓冲区的内容,并追加到以后模板块文本的前面 
l #列表不能打印字符的清单
n #读取下一个输出行,用下一个命令解决新的行而不是用第一个命令
N #追加下一个输出行到模板块前面并在二者间嵌入一个新行,扭转以后行号码
p #打印匹配的行
P #(大写) 打印模板的第一行
q #退出 Sed
b #lable 分支到脚本中带有标记的中央,如果分支不存在则分支到脚本的开端
r #file 从 file 中读行
t #label if 分支,从最初一行开始,条件一旦满足或者 T,t 命令,将导致分支到带有标号的命令处,或者到脚本的开端
T #label 谬误分支,从最初一行开始,一旦产生谬误或者 T,t 命令,将导致分支到带有标号的命令处,或者到脚本的开端
w #file 写并追加模板块到 file 开端 **
W #file 写并追加模板块的第一行到 file 开端 **
! #示意前面的命令对所有没有被选定的行产生作用 ** 
= #打印以后行号码 **
# #把正文扩大到下一个换行符以前 **

Sed 替换命令

g #示意行内全面替换(全局替换配合 s 命令应用)p #示意打印行 
w  #示意把行写入一个文件 
x #示意调换模板块中的文本和缓冲区中的文本 
y #示意把一个字符翻译为另外的字符(然而不用于正则表达式)1  #子串匹配标记 
& #已匹配字符串标记

Sed 正则

^ #匹配行开始 
$ #匹配行完结
. #匹配一个非换行符的任意字符
* #匹配 0 个或多个字符
[] #匹配一个指定范畴内的字符
[^]  #匹配一个不在指定范畴内的字符 
(..) #匹配子串
&  #保留搜寻字符用来替换其余字符
< #匹配单词的开始
>  #匹配单词的完结
x{m} #反复字符 x,m 次
x{m,} #反复字符 x,至多 m 次 
x{m,n} #反复字符 x,至多 m 次,不多于 n 次

Sed 罕用实例

1、替换操作

echo "hello world" |sed 's/ /-/1g'
hello-world 
#从第一个空格开始全局替换成 -,只不过文本中只有一个空格

2、删除操作

sed '/^$/d' filename #删除空白行
sed '2d' filename #删除第二行
sed '2,$d' filename #删除第二直到未尾所有行
sed '$d' filename #删除最初一行
sed '/^test/'d filename #删除以 test 结尾行

3、匹配替换

echo "hello world" |sed 's/w+/[&]/g'
[hello] [world]
echo "hello world" |sed 's/w+/"&"/g'
"hello" "world"
#w+ 匹配每一个单词,& 示意匹配到的字符串
echo AAA bbb |sed 's/([A-Z]+) ([a-z]+)/[2] [1]/'
[bbb] [AAA]
#子串匹配替换

4、选定范畴

sed -n '/= 0/,/max/p' svnserve.conf
#min-encryption = 0
#max-encryption = 256
#所有在 = 0 到 max 范畴内的行都会被打印进去

5、sed 多点编辑性能(-e)

[root@centos001 ~]#cat -n test 
1  this is a test file
2  welcome
3  to
4  here
5  hello WORLD
6
7  linux centos6.8
8  redhat
sed -e '2,6d' -e 's/linux centos6.8/Linux Centos6.8/' test
this is a test file
Linux Centos6.8
redhat
#如果两条命令性能一样,那么就须要用到上面的参数
sed --expression='s/linux centos6.8/Linux Centos6.8/' --expression='s/to/TO/' test**
this is a test file
welcome
TO
here
hello WORLD
Linux CenTOs6.8
redhat

6、读入与写入

[root@centos001 ~]#cat test1
welcom 
to 
here
[root@centos001 ~]#sed '/here/r test1' test
this is a test file
welcome
to
here
#welcom
to
here#
hello WORLD
linux centos6.8
redhat
#将 test1 的文件内容读取显示所有匹配 here 行的前面
sed -n '/centos6.8/w test2' test
[root@centos001 ~]#cat test2
linux centos6.8
#将 test 文件匹配到 centos6.8 的所有行都写入到 test2 文件中,文件能够不存在.
#如果文件存在,就会被重定向不是追加

7、追加与插入

[root@centos001 ~]#sed '/^l/a2017-08-08' test2
linux centos6.8
2017-08-08
#在匹配以 l 结尾的行的前面追加 2017-08-08
[root@centos001 ~]#sed '1a2017-08-08' test2
linux centos6.8
2017-08-08
#在第一行的前面追加 2017-08-08
[root@centos001 ~]#sed '/^l/i2017-08-08' test2
2017-08-08
linux centos6.8
#在匹配以 l 结尾的行的后面插入 2017-08-08
####### 以上操作是不会扭转文件内容 ################
[root@centos001 ~]#sed -i '/^l/i2017-08-08' test2
[root@centos001 ~]#cat test2
2017-08-08
linux centos6.8

8、其它命令实例

[root@centos001 ~]#cat -n test2
 1 2017-08-08
 2 linux centos6.8
 3 08
 4
 5 test
[root@centos001 ~]#**sed '/08/{n; s/l/L/;}' test2
2017-08-08
Linux centos6.8
08
test
#如果 08 匹配到就跳到下一行,将小写 l 替换成大写,留神到第三行也是被匹配到
#然而前面的条件不满足,所有没有被替换
[root@centos001 ~]#sed '1,4y/8/9/' test2
2017-09-09
linux centos6.9
09
test
#将 1 至 4 行所有的数字 8 替换成 9
[root@centos001 ~]#**sed '1q' test2**
2017-08-08
#打印第一行内容后退出

9、打印奇数或公偶数行

[root@centos001 ~]#sed -n 'p;n' test2
20170808
08
[root@centos001 ~]#sed -n 'n;p' test2
linux centos6.8
test
[root@centos001 ~]#sed -n '1~2p' test2
20170808
08
[root@centos001 ~]#sed -n '2~2p' test2
linux centos6.8
test

10、打印匹配字符串行的下一行

[root@centos001 ~]#sed -n '/linux/{n;p}' test2
08
[root@centos001 ~]#awk '/linux/{getline; print}' test2
08

每天一个 Linux 命令(1):xargs

退出移动版