Linux三剑客——sed

第1章 sed知识点

1.1 sed是什么

字符流编辑器 Stream Editor

sed是一种流编辑器,它是文本处理中很是中的工具,可以完美的配合正则表达式使用,功能与众不同。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

1.2 sed功能与版本

1)处理纯文本文件,日志,配置文件等==>Linux正则表达式

2)增长、删除、修改、查询vim

3)sed --versionbash

[root@wuhuang ~]# sed --versionapp

GNU sed version 4.2.1编辑器

Copyright (C) 2009 Free Software Foundation, Inc.ide

This is free software; see the source for copying conditions.  There is NO工具

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,this

to the extent permitted by law.spa

 

GNU sed home page: <http://www.gnu.org/software/sed/>.日志

General help using GNU software: <http://www.gnu.org/gethelp/>.

E-mail bug reports to: <bug-gnu-utils@gnu.org>.

Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.

1.3 语法格式

sed [选项] [sed指令] [输入文件]

sed -i.bak 's#oldboy#oldgirl#g' oldboy.txt

-i  ----sed命令的参数

s ---sed指令

g ---小尾巴/修饰

1.4 sed 命令运行过程

sed是一种流编辑器,它是文本处理中很是中的工具,可以完美的配合正则表达式使用,功能与众不同。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。

第2章 查询 pprint

2.1 按行查询

2.1.1 单行

1.   p 打印模式空间的内容

2.   -n 取消默认的sed软件的输出

建立环境

[root@wuhuang ~]# cd /wuhuang/

[root@wuhuang wuhuang]# touch person.txt

[root@wuhuang wuhuang]# cat >>person.txt<<EOF

> 101,wuhuang,CEO

> 102,zhangyao,CTO

> 103,Alex,COO

> 104,yy,CFO

> 105,feixue,CIO

> EOF

1: 取具体的某一行   sed -n '3p' person.txt

[root@wuhuang wuhuang]# sed -n '3p' person.txt

103,Alex,COO

2. 显示文件的最后一行  sed -n '$p' person.txt

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO                                                                                                      

[root@wuhuang wuhuang]# sed -n '$p' person.txt

105,feixue,CIO  

3. 取包含xxx的行

[root@wuhuang wuhuang]# sed -n '/wuhuang/p' person.txt 

101,wuhuang,CEO


2.1.2 多行

1. 连续的多行-地址范围精讲  连续的行使用 ,

没有地址,默认匹配全部行

sed -n ‘从哪里来,哪里去p

  数字 sed -n '1,3p' person.txt

[root@wuhuang wuhuang]# sed -n '1,3p' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

 2. 正则地址范围-模糊,容易找多了

 正则 sed -n '/wuhuang/p' person.txt

          sed -n '/wuhuang/,/yy/p' person.txt

[root@wuhuang wuhuang]# sed -n '/oldboy/p' person.txt

101,wuhuang,CEO

[root@wuhuang wuhuang]# sed -n '/o.*y/p' person.txt 

101,wuhuang,CEO

[root@wuhuang wuhuang]##显示包含oldboy的行到包含yy的行

[root@wuhuang wuhuang]# sed -n '/oldboy/,/yy/p' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

3. 不连续的多行 使用 ; 号隔开(使用分号)

[root@wuhuang wuhuang]# #同一行放多个命令用;

[root@wuhuang wuhuang]# sed -n '1p;4p;5p' person.txt 

101,wuhuang,CEO

104,yy,CFO

105,feixue,CIO


2.1.3 过滤多个字符

-r 支持扩展正则表达式

| 扩展正则,同时过滤多个字符

[root@wuhuang wuhuang]# sed -nr '/wuhuang|yy/p' person.txt 

101,wuhuang,CEO

104,yy,CFO sed里面的正则字符左右必须有“/


第3章 增长

3.1 单行增长

a 追加append,在指定行后添加一行或多行文本

i 插入insert,在指定行前添加一行或多行文

[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

[root@wuhuang wuhuang]# sed '2i 106,wuxingge,UFO\n107,lee,XO' person.txt

101,wuhuang,CEO

106,wuxingge,UFO

107,lee,XO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


3.2 多行增长

换行符 \n

[root@wuhuang wuhuang]# sed '$a 106,wuxingge,UFO\n107,lee,XO' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

106,wuxingge,UFO

107,lee,XO

注:cat 命令多行追加

  echo只能在追加到文件末尾  echo >>

  vim 能够写入

第4章 删除

4.1 单行删除

  d删除 delete

  $ 表明文件的最后一行

  '1d'  或 '/oldboy/d'

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO  

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed '/wuhuang/d' person.txt 

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


4.2 多行删除

[root@wuhuang wuhuang]# sed '1,4d' person.txt 

105,feixue,CIO

4.3 企业案例:不显示文件中的空行

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

[root@wuhuang wuhuang]# sed -r '/^$/d' person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

2. grep -v '^$' person.txt

[root@wuhuang wuhuang]# grep -v '^$' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

3. awk '!/^$/' person.txt

[root@wuhuang wuhuang]# awk '!/^$/' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

4. sed -n '/^$/!p' person.txt

[root@wuhuang wuhuang]# sed -n '/^$/!p' person.txt 

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


第5章 替换

5.1 文本替换

5.1.1 sed -i 's#a#b#g' wuhuang.log

  s   单独使用——>将每一行中第一个匹配的字符串进行替换

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed 's#[0-9]#wuhuang#' person.txt 

wuhuang01,wuhuang,CEO

wuhuang02,wuhuang,CTO

wuhuang03,Alex,COO

wuhuang04,yy,CFO

wuhuang05,feixue,CIO

   g   global 每一行进行所有替换——>sed指令s的替换标志之一(全局替换)

[root@wuhuang wuhuang]# sed 's#[1-9]#AA#g' person.txt

AA0AA,wuhuang,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO


5.1.2 修改文件 -i

  sed -i.bak 's#[1-9]#AA#g' person.txt

  -i.bak  先把文件备份为 person.txt.bak ,而后再修改文件的内容

   -i   参数要放在sed全部参数最后面

sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@wuhuang wuhuang]# sed -i.bak.$(date +%F) 's#[1-9]#AA#g' person.txt

[root@wuhuang wuhuang]# cat person.txt

AA0AA,wuhuang,CEO

AA0AA,zhangyao,CTO

AA0AA,Alex,COO

AA0AA,yy,CFO

AA0AA,feixue,CIO

[root@wuhuang wuhuang]# cat person.txt.bak.2018-01-12

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO


5.2 变量替换

5.2.1 变量替换

[root@wuhuang wuhuang]# a=wuhuang    定义变量

[root@wuhuang wuhuang]# b=old       定义变量

[root@wuhuang wuhuang]# cat person.txt

101,wuhuang,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

[root@wuhuang wuhuang]# sed "s#$a#$b#g" person.txt   sed使用变量

101,old,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

5.2.2 引号的区别总结

1.单引号-所见即所得

[root@wuhuang wuhuang]# echo 'stu{1..6},`pwd`'

stu{1..6},`pwd`

2.双引号-对特殊符号进行解析 $ $() ``

[root@wuhuang wuhuang]# echo "stu{1..6},`pwd`"

stu{1..6},/wuhuang

[root@wuhuang wuhuang]# echo "I'm aaa"

I'm aaa                                         

[root@wuhuang wuhuang]# echo 'I'm aaa'

> ^C 想要显示单引号是需用双引号

3.不加引号和双引号同样,支持通配符{}*.txt

[root@wuhuang wuhuang]# echo stu{1..6},`pwd`

stu1,/wuhuang stu2,/wuhuang stu3,/wuhuang stu4,/wuhuang stu5,/wuhuang stu6,/wuhuang

4.反引号

[root@wuhuang wuhuang]# echo `pwd` ddd

/wuhuang ddd

5.3 反向引用

()的功能能够禁止正则表达式的一部分

扩展正则,使用-r

\1引用第一个小括号中的匹配内容, \2引用第二个小括号中的匹配内容,sed最多能够记住9

5.3.1 预备知识——sed &

sed &前面正则匹配到的内容

[root@wuhuang wuhuang]# echo 123456|sed -r 's#([0-9])#<\1>#g'

<1><2><3><4><5><6>

[root@wuhuang wuhuang]# echo 123456|sed  's#[0-9]#<&>#g'

<1><2><3><4><5><6>

[root@wuhuang wuhuang]# echo this is a test line | sed 's#.#<&>#g'

<t><h><i><s>< ><i><s>< ><a>< ><t><e><s><t>< ><l><i><n><e>

正则表达式 \w\+ 匹配每个单词,使用 <&>替换它,& 对应于以前所匹配到的单词

[root@wuhuang wuhuang]# echo this is a test line | sed 's#\w\+#<&>#g'

<this> <is> <a> <test> <line>

案例:echo "I am oldboy teacher." 若是想保留这一行的单词oldboy

[root@wuhuang wuhuang]# echo "I am wuhuang teacher." |sed -r 's#.*(ol.*y).*#\1#g'

wuhuang

5.3.2 命令拼接——解决不会使用循环

/oldboy/下全部.jpg的文件名修改成.avi

1. 先在屏幕上拼接出目标命令

[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g'

mv wuhuang01.jpg wuhuang01.avi

mv wuhuang02.jpg wuhuang02.avi

mv wuhuang03.jpg wuhuang03.avi

mv wuhuang06.jpg wuhuang06.avi

mv wuhuang07.jpg wuhuang07.avi

mv wuhuang08.jpg wuhuang08.avi

mv wuhuang09.jpg wuhuang09.avi

mv wuhuang10.jpg wuhuang10.avi

2. 最终交给 |bash执行

[root@wuhuang wuhuang]# ls wuhuang*.jpg |sed -r 's#(.*)jpg#mv & \1avi#g' |bash

[root@wuhuang wuhuang]# ls wuhuang*

wuhuang01.avi  wuhuang03.avi  wuhuang05.avi  wuhuang07.avi  wuhuang09.avi  wuhuang.txt

wuhuang02.avi  wuhuang04.avi  wuhuang06.avi  wuhuang08.avi  wuhuang10.avi

5.4 拓展

5.4.1 rename替换(重命名)

rename     from         to         file...

        你要替换的内容   替换成什么   替换哪些文件

rename      jpg         avi        *.jpg

[root@wuhuang wuhuang]# rename jpg avi *.jpg

[root@wuhuang wuhuang]# ls

wuhuang01.avi  wuhuang03.avi  wuhuang05.avi  wuhuang07.avi  wuhuang09.avi    

wuhuang02.avi  wuhuang04.avi  wuhuang06.avi  wuhuang08.avi  wuhuang10.avi  

 5.4.2 sed里面表示非

5.4.3 特殊符号=获取行号

5.4.4 一条sed语句执行多条命令

第6章 使用sed命令常见的坑

6.1 -r -i同时使用

  -r 参数在前面

-ri  正常

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangoooy

test

[root@wuhuang wuhuang]# sed -ri 's#[o]+{2}#AAAA#g' ett.txt

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangAAAAy

test

-ir  先把文件备份为xxr,而后再替换文件中的内容

[root@wuhuang wuhuang]# cat ett.txt

wuhuang

wuhuangoy                                                           源文件内容

test

[root@wuhuang wuhuang]# sed -ir 's#[l]+{2}#o#g' ett.txt       sed -ir先备份 

[root@wuhuang wuhuang]# ll ett.*

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:56 ett.txtr                 备份为ett.txtr

[root@wuhuang wuhuang]# cat ett.txt                        由于在上面的命令里r已经不是参数,因此sed 默认不支持扩展正则,文件没有被修改,只是备份

wuhuang                                                          

wuhuangoy

test

[root@wuhuang wuhuang]# cat ett.txtr

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# sed -rir 's#[l]+{2}#o#g' ett.txt  从新给sed 加上 -r 参数,使 sed支持扩展正则

[root@wuhuang wuhuang]# ll ett.*                                    

-rw-r--r-- 1 root root 19 Jan 12 19:58 ett.txt

-rw-r--r-- 1 root root 20 Jan 12 19:58 ett.txtr                             新备份的文件覆盖了刚才的文件

[root@wuhuang wuhuang]# cat ett.txt                                     源文件被替换

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# cat ett.txtr                                 备份文件内容不变

wuhuang

wuhuangoy

test

6.2 -i禁止与-n一块儿使用(回顾sed的执行过程)

 -i-n一块儿使用会把源文件的内容清空

[root@wuhuang wuhuang]# cat ett.txtr

wuhuang

wuhuangoy

test

[root@wuhuang wuhuang]# sed -ni 's#oldboy#123456#g' ett.txtr

[root@wuhuang wuhuang]# cat ett.txtr |wc -l

0

相关文章
相关标签/搜索