sed命令详解

1.sed命令参数详解

sed [options] [function] [input-file]

sed 选项动作输入文件

选项与参数

-n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来.如:sed -n '2,5p' sed.txt(2-5行打印出来)

-e :直接在命令列模式上进行 sed 的动作编辑;

-f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;

-r sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)

-i :直接修改读取的文件内容,而不是输出到终端。

动作说明 [n1[,n2]]function

n1, n2 :不见得会存在,一般代表『选择进行动作的行数』,举例来说,如果我的动作是需要在 10 到 20 行之间进行的,则『 10,20[动作行为

function

:新增, 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)

:取代, 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!如:sed 2c fengxiaoli sed.txt(把第二行替换为fengxiaoli,不常用)

:删除,因为是删除啊,所以 后面通常不接任何咚咚;

:插入, 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)

:列印,亦即将某个选择的数据印出。通常 会与参数 sed -n 一起运行~

:取代,可以直接进行取代的工作哩!通常这个 的动作可以搭配正规表示法!例如 1,20s/old/new/g

 

2.sed命令执行的地址范围

10[function]匹配到第10

10,20[function]匹配到10-20

10,+20[function]匹配10行开始之后的20

1~2[function]匹配(以1开头 2间隔)1,3,7,9

2~2[function]匹配 2468

10,$[function]匹配10行到结尾

 

/zhangyao/[function]匹配有zhangyao的那一行

/zhangyao/,/Alex/[function]匹配有zhangyao的那一行到有Alex的那一行,若有重复字符串请自行测试

/zhangyao/,$[function]匹配有zhangyao的那一行到结尾

 

10,/Alex/[function]匹配10行到有Alex的那一行

/zhangyao/,+20[function]匹配有zhangyao的那一行开始之后的20

/Alex/,10[function]匹配有Alex的那一行到10

 

3.增删查改

3.1增加(可以指定上面的范围测试)

sed '2a 3fengxiaoli' sed.txt(a增加在第二行的后面)

sed '2a 3fengxiaoli\n4wangcheng' sed.txt(多行增加)

sed '2i fengxiaoli' sed.txti增加在第二行的前面)

 

3.2删除(可以指定上面的范围测试)

sed '2d' sed.txt (删除第二行)

sed '2,5d' sed.txt (删除2-5行)

 

3.3.1替换(可以指定范围,不指定范围就是替换全部匹配的字符串)

sed s#替换之前字符串#替换之后字符串#g sed.txt

sed s/替换之前字符串/替换之后字符串/g sed.txt

1sed -i '5s#disabled#enforcing#g' /etc/selinux/config

3.3.2分组替换

echo I am oldboy teacher |sed 's#^.*am \([a-z].*\) tea.*$#\1#g'

(蓝色的是任意以am开头,tea任意结尾;红色的\([a-z].*\) 是替换之后的内容,也就是oldboy,替换之后以\1输出;小括号是扩展正规表达式,如果没加-r需要\转义)

echo I am oldboy teacher |sed 's#I \(.*\) \([a-z].*\) tea.*$#\1 \2#g'(最多只支持9个括号)

3.33Ms# # #Ng

Ms M行操作,无g标志则对匹配的第1列处理,有g则对这一行处理

如:

[root@www test]# cat sed.txt

1 1 1 1

1 1 1 1

1 1 1 1

[root@www test]# sed 's#1#0#' sed.txt

0 1 1 1

0 1 1 1

0 1 1 1

Ng 从第N处列开始到结尾替换

[root@www test]# sed 's#1#0#2g' sed.txt

1 0 0 0

1 0 0 0

1 0 0 0

Mg Ng 对第M行从第N处到结尾匹配替换

[root@www test]# sed '2s#1#0#2g' sed.txt

1 1 1 1

1 0 0 0

1 1 1 1

企业案例1

[root@www ~]# chkconfig --list |grep 3:on|grep -Ev "sshd|crond|network|rsyslog|sysstat"|awk '{print $1}'|sed -r 's#(.*)#chkconfig \1 off#g'

chkconfig abrt-ccpp off

chkconfig abrtd off

chkconfig acpid off

chkconfig atd off

chkconfig auditd off

chkconfig autofs off

...................

案例2

[root@www test]# for i in {1..5};do touch stu_10299_${i}_finished.jpg;done

[root@www test]# ls

stu_10299_1_finished.jpg  stu_10299_3_finished.jpg  stu_10299_5_finished.jpg

stu_10299_2_finished.jpg  stu_10299_4_finished.jpg

[root@www test]# ls *.jpg|sed -r 's#(.*)_finished.*#mv & \1.jpg#g'(这里&表示原来的文件名)

mv stu_10299_1_finished.jpg stu_10299_1.jpg

mv stu_10299_2_finished.jpg stu_10299_2.jpg

mv stu_10299_3_finished.jpg stu_10299_3.jpg

mv stu_10299_4_finished.jpg stu_10299_4.jpg

mv stu_10299_5_finished.jpg stu_10299_5.jpg

 

3.4(打印)

sed -n '2p' sed.txt-n 参数一般和p连用)

sed -n s#zhangyao#NB#p sed.txt

 

4.修改文件

sed -i 's#vn#fengxiaoli#g' sed.txt

[root@www test]# sed -i.back 's#vnsvf#fengxiaoli#g' sed.txt (修改文件的同时将源文件备份)

[root@www test]# cat sed.txt

adfja

qwianf

ariung

ljjqf

fengxiaoli

[root@www test]# cat sed.txt.back

adfja

qwianf

ariung

ljjqf

vnsvf

5.1忽略大小写举例

[root@www test]# cat sed.txt

adfja

qwianf

ariung

ljjqf

FENGxiaolisvf

[root@www test]# sed 's#fengxiaolisvf#fengxiaoli#gi' sed.txt

adfja

qwianf

ariung

ljjqf

fengxiaoli

5.2改变指定位置大小写

[root@www test]# cat sed.txt

ceo,101,OLDBOY

cto,102,ZHANGYAO

coo,103,ALEX

cfo,104,YY

cio,105,FEIXUE

[root@www test]# sed -r 's#(.*),(.*),(.*)#\L\3, \E\1, \U\2#g' sed.txt

oldboy, ceo, 101

zhangyao, cto, 102

alex, coo, 103

yy, cfo, 104

feixue, cio, 105

注:\l在替换字符中使用\l标志时,它会把紧跟在其后面的第一个字符当做小写字符处理

\L在替换字符中使用\L标志时,它会把紧跟在其后面的所有字符当做小写字符处理

\u在替换字符中使用\u标志时,它会把紧跟在其后面的第一个字符当做大写字符处理

\U在替换字符中使用\U标志时,它会把紧跟在其后面的所有字符当做小写字符处理

\E需要和\U或者\L一起使用,它将关闭\U或者\L的功能

 

6.sed用等号显示行号

[root@www test]# sed '=' sed.txt

1

ceo,101,OLDBOY

2

cto,102,ZHANGYAO

3

coo,103,ALEX

4

cfo,104,YY

5

cio,105,FEIXUE

 

7.一条sed语句执行多条sed命令

如例1sed 3,$d sed.txt |sed s#10#01#g

2sed -e 3,$d -e s#10#01#g’’ sed.txt

3sed 3,$d;s#10#01#g sed.txt(建议用这种最简单)

4

[root@www test]# cat sed_jiaoben.txt

3,$d

s#10#01#g

[root@www test]# sed -f sed_jiaoben.txt sed.txt

注:该四条命令执行结果相同

 

企业案例:一个文件100行,把53570行单独拿出来

sed -n '5p;35p;70p' sed.txt

 

8.特殊符号大括号

[root@www test]# sed -n '2,4{p;=}' sed.txt

cto,102,ZHANGYAO

2

coo,103,ALEX

3

cfo,104,YY

4

注:大括号里的意思是先显示2-4行,然后在显示2-4行的行号

 

9.2行变为1

[root@www test]# sed '=' sed.txt

1

ceo,101,OLDBOY

2

cto,102,ZHANGYAO

3

coo,103,ALEX

4

cfo,104,YY

5

cio,105,FEIXUE

注用N参数后其实是

1\nceo,101,OLDBOY

2\ncto,102,ZHANGYAO

3\ncoo,103,ALEX

4\ncfo,104,YY

5\ncio,105,FEIXUE

然后再将\n替换为空格

[root@www test]# sed '=' sed.txt|sed 'N;s#\n# #'

1 ceo,101,OLDBOY

2 cto,102,ZHANGYAO

3 coo,103,ALEX

4 cfo,104,YY

5 cio,105,FEIXUE

 

企业案例

[root@www test]# cat sed.txt

1412412

dsnafan

243124

dfafdaf

2134125

adafafa

[root@www test]# sed 'N;s#\n#=#g' sed.txt

1412412=dsnafan

243124=dfafdaf

2134125=adafafa

 '


本文转自 fxl风 51CTO博客,原文链接:http://blog.51cto.com/fengxiaoli/1947413


你可能感兴趣的:(sed命令详解)