第二节 sed详解

一、sed

1. 语法

扩展:  sed  -r

语法: sed    [options]     'command'      in_file[s]

2.options部分

(1)    -n  静默输出  (不打印默认输出,所以只输出一次)

(2)  -e   给予sed多个命令的时候需要-e选项

#sed -e 's/root/haha/g' -e 's/bash/wwwww/g' passwd > passwd.bak

如果不用-e选项也可以用分号“;”把多个命令隔开。

#sed   's/haha/ro/g ; s/wwwww/kkkk/g'   passwd | less

(3)-i    -i后面没有扩展名的话直接修改文件,如果有扩展名,则备份源文件,产生以扩展名结尾的新文件

#sed   -iback  's/root/rottt/g; s/bash/wwwww/g'   passwd       //选项-i后面没有空格

[root@localhost 桌面]# ls
passwd     passwdback

(4) -f  当有多个要编辑的项目时,可以将编辑命令放进一个脚本里,再使用sed搭配 -f 选项执行

[root@localhost 桌面]# cat s.sed
s/bin/a/g
s/ftp/b/g
s/mail/c/g
[root@localhost 桌面]# sed   -f   s.sed   passwd | less

3.command 部分

格式: ' [地址1,地址2]   [函数] [参数(标记)] '

(1)定址的方法:

(1.1)数字定址:(行号)

1  单行

#sed  -n  ‘1p’  passwd   ----打印第一行内容

1,3  范围    从第一行到第三行

#sed  -n  ‘1,3p’  passwd   -----打印第一行到第三行

cat -n 1.txt | sed '3,8s/ / /'     -n 加行号

2,+4    从第2行到第6行

4,~3   从第四行到下一个三的倍数行(第六行)

1~3  第一行起每间隔三行的行

奇数 1~2

偶数 0~2

$  尾行

1!  除了第一行以外的行

(1.2)正则定址

 正则使用规则:

正则必须用//包裹起来

扩展正则需要用 -r 参数或转移


范例:

#cat file.txt
.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN

#sed ‘/Beijing/s/CN/China/' file.txt   ------定位到含有Beijing字符串的行


(1.3)数字定址和正则定址结合使用

5,/a/s///    --------从第五行开始到所有有字符a的行

/a/,5s///     -------从所有有字符a的行(第五行之前的)到第五行

/a/,/b/s///    ------从有字符a的行到有字符b的行


(2)函数(子命令):

     (2.1)增删改

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

例题:在testfile文件的第四行后添加一行在命令行提示符下输入如下命令:

sed '4a \newLine' testfile 

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

sed '4i \newLine' testfile

        c 取代  ------c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行

sed '1,4c \newLine' testfile --用newLine取代1到4行的所有内容(换乘一行)

       d  删除  ------删除行

        d      删除所有的行         sed   'd'  1.txt                            

        1d     只删除第一行        sed   '1d'    1.txt                                                        

         $d     使用寻址符号$,删除最后一行     sed   '$d'  1.txt                                

        /^$/d    删除空行,正则表达式必须封闭在斜杠//当中         sed   '/^$/d'  1.txt    ---正则表达式要放在//中

        /^\.TS/,/^\.TE/d      删除以.TS开头到.TE开头的行             sed   '/^\.TS/,/^\.TE/d '    1.txt   ----用多个正则表达式定位

         5,$d                      删除第五行到结尾所有的行

        #sed '1,/^$/d' file.txt      混合使用行地址和模式地址    ----删除第一行到第一个空行之间的行

         1,5!                     删除除1—5行之外的行(保留1到5行)

 (2.2)替换s ----与c不同(s只针对一行中的部分内容进行替换,c一次把多行的内容替换成一行内容)

语法:[address ]  s/pattern /replacement /flags

(2.2.1)标志flags是:

n 可以是1-512,表示第n次出现的情况进行替换
g 全局更改

p 打印模式空间的内容

将文本内容打印三次: #sed   '{p;p}'   a.txt  ----还有一个默认的模式空间打印输出

w file 写入到一个文件file中 了解
i 忽略大小写

[root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/'
AB
[root@wing ~]# echo Aaaaba | sed -r 's/a.*/B/i'
B

s 字符串替换 s/old/new/


(2.2.2)replacement部分用下列字符会有特殊含义:

& 用正则表达式匹配的内容进行替换

例题:

把所有大写字母用括号()括起来。

# sed -r 's/[A-Z]+/(&)/g' sed.txt


\n 回调参数   后向引用   n的范围是1-9

例题:

删除文件每行的倒数第二个字符。

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


(2.3)    y字符替换

利用y字符替换来实现(小写换大写

替换字符串

sed  'y/abc/ABC/'   test.txt

tr用法-----
cat  test.txt  | tr  a-z  A-Z

(2.4)r 从文件中读入内容到指定行的后面

#sed  '2r  b.txt'   a.txt

将b.txt文件内容读入到文件a.txt的第2行后面

(2.5){ }范例:

#cat file.txt
.TS
Beijing,CN
.TE
Shanghai,CN
guangzhou,CN
shenyang,CN

命令还可以用大括号进行分组,第一个命令可以和大括号放在同一行,但是右大括号必须自己一行
分组命令(写在文档中用#sed   -f 来执行)
/^\.TS/,/^\.TE/{
s/CN/China/
s/Beijing/BJ/
}

sed    '2,3{s/cn/china/;s/a/b/}'    file.txt     -----同一范围的两个替换可以用大括号括起来一起,中间加分号


二、sed扩展知识

1.模式空间:

初始化为空,处理完一行后会自动输出到屏幕并清除模式空间。

解释:(读入第一行内容然后和子命令进行匹配,然后执行替换等等命令,匹配完一行后没有匹配的子命令了,将处理完的内容输出到屏幕上,然后清空模式空间,再读入第二行)

2.保持空间:

初始化为一个空行,也就是默认带一个\n,处理完后不会自动清除。


3.模式空间和保持空间的置换(hHgGx)

h 把模式空间内容覆盖到保持空间中(复制)

H 把模式空间内容追加到保持空间中

g 把保持空间内容覆盖到模式空间中

G 把保持空间内容追加到模式空间中  (粘贴)

x 交换模式空间与保持空间的内容


例题:
将第一行插入到每个偶数行的后面

$ sed  '1h;0~2G'  a.txt
11111111
22222222
11111111
33333333
44444444
11111111
55555555
66666666
11111111


4.控制流NPD

!  命令取反 例: 1!d 删除第一行以外的行
= 打印行号(输入行的号码,而非处理的次数行号) 例如: sed -n   '2{=;p}'   2.txt    打印行号并打印这一行的内容
n 读入下一行到模式空间       例:'4{n;d}' 删除第5行

N 而是追加下一行到模式空间,再把当前行和下一行同时应用后面的命令
P 输出多行模式空间的第一部分,直到第一个嵌入的换行符为止。在执行完脚本的最后一个命令之后,模式空间的内容自动输出。

D 删除模式空间中直到第一个换行符的内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用与模式空间剩余的内容。


N;P;D

删除文件倒数第二行
sed   'N;$!P;D'   a.txt
删除文件最后两行
sed 'N;$!P;$!D;$d' a.txt



颠倒输出(tac的功能)
$ sed   '1!G;h;$!d'  1.txt

3

2

1


猜你喜欢

转载自blog.csdn.net/bijingzhao123/article/details/80098592
今日推荐