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 ---小尾巴/修饰
sed是一种流编辑器,它是文本处理中很是中的工具,可以完美的配合正则表达式使用,功能与众不同。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
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 |
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 |
-r 支持扩展正则表达式
| 扩展正则,同时过滤多个字符
[root@wuhuang wuhuang]# sed -nr '/wuhuang|yy/p' person.txt 101,wuhuang,CEO 104,yy,CFO sed里面的正则字符左右必须有“/” |
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 |
换行符 \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 能够写入
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 |
[root@wuhuang wuhuang]# sed '1,4d' person.txt 105,feixue,CIO |
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 |
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 |
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 |
[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 |
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个
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 拓展
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里面表示非
-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 |