浅谈sed

Posted 小宇宙哈

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈sed相关的知识,希望对你有一定的参考价值。

1.1 SED

1.1.1 sed是什么 :全称字符流编辑器Stream Edite

 

1.1.2 sed功能与版本:

1. 处理纯文本文件、日志、配置文件

2. 增删改查

3. 查看sed版本:sed --version

 

1.1.3 语法格式

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

2. sed -i.bak \'s#oldboy#oldbgirl#g\' oldboy.txt

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

4. s --sed指令

5. g ---就是个修饰

 

1.1.4 sed命令的实行过程  

1. 把内容读取到内存中(模式空间)

2. 判断是否是满足我要的条件(默认都会显示到屏幕)

3. 3. sed有个默认输出所以不加-n,都会显示到屏幕

4. 继续读取直到最后一行

 

1.1.5 sed常用功能

实验环境:

[root@georgekai ~]# vim person.txt

101,oldboy,CEO

102,zhangyao,CTO

103,Alex,COO

104,yy,CFO

105,feixue,CIO

 

实例1-1 查询p(print)

1. 单行 - 行号

[root@georgekai ~]# sed -n \'3p\' person.txt

 

2. 找出包含oldboy的行

[root@georgekai ~]# sed -n \'/oldboy/p\' person.txt

注://中间可以写需要找的内容

 

3. 多行连续显示(知道行号)

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

 

4. 多行连续显示,显示包含oldboy的行到包含yy的行(不知道行号,模糊查找)

[root@georgekai ~]# cat person.txt|sed -n \'/oldboy/,/yy/p\'

 

5. 显示不连续的行

[root@georgekai ~]# nl person.txt |sed -n \'1p;3p;4p\'

注:sed或awk中,加多个命令,用分号分割(;)

 

实例1-2 增加

1. 在文件最后一行增加俩行

方法一:[root@georgekai ~]# echo -e "106,wuxingge,UFO\\n107,lee,XO" >>person.txt

方法二:[root@georgekai ~]# nl person.txt |sed -n \'$a 106,wixingge,UFO\\n107,lee,XO.p\'

    注:1. 这里的$表示最后一行,a前面可加行号

      2. a === append追加,当前行的下一行追加

      3. i === insert插入,当前行的上一行插入

      4. 中间的\\n ,表示回车键

方法三:[root@georgekai ~]# cat >> person.txt <<EOF

    EOF

 

实例1-3 删除

1. 单行删除

[root@georgekai ~]# nl person.txt |sed \'1d\' -i

2. 多行删除

[root@georgekai ~]# cat person.txt |sed \'/old/,/yy/d\'

root@georgekai ~]# cat person.txt|sed \'1d;3d;4d;5d\'

 

2.不显示文件的空行

方法一:[root@georgekai ~]# cat person.txt |grep -v \'^$\'

方法二:[root@georgekai ~]# cat person.txt |sed -n \'/^$/!p\'

注:!在sed中也是取反的意思

方法三:[root@georgekai ~]# cat person.txt |sed \'/^$/d\'

方法四:[root@georgekai ~]# cat person.txt |awk \'!/^$/\'

 

实例1-4 替换s

注:在“s###g”中遇到以#开头的条件,3个#可以用3个@代替

1. 不加小g,默认只替换每一行的第一个找到的条件

[root@georgekai ~]# sed \'s#[1-9]#AAAA#\' person.txt

注:后面加g,会替换每一行满足条件的所有

2. 备份

[root@georgekai ~]# sed -i.bak.$(date +%F) \'sg#old#boy#\' person.txt

注:先备份源文件,在修改源文件的内容

3. sed中变量的使用

[root@georgekai ~]# x=oldboy

[root@georgekai ~]# y=oldgirl

[root@georgekai ~]# sed "s#$x#$y#g" person.txt

注:sed的使用变量需要用双引号

 4. 单引号与双引号区别

  [root@oldboyedu43-lnb oldboy]# echo \'I\'am lee\'

  > ^C

  [root@oldboyedu43-lnb oldboy]# echo "I\'am lee"

  I\'am lee

  [root@oldboyedu43-lnb oldboy]# echo \'I"am" lee\'

  I"am" lee

 

实例1-5 反向引用(先保护,在使用)

 1. &符号的作用

  [root@georgekai ~]# echo \'123456\' |sed -r \'s#.#<&>#g\'

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

  注:& 表示前俩个#号中间正则匹配到的所有内容

 2. 命令拼接,批量修改文件名称

创建环境:

  [root@georgekai ~]# touch oldboy{01..10}.jpg

如何修改:

  方法一:[root@georgekai ~]# ls oldboy*.avi|sed -r \'s#(.*).avi#mv & \\1.jpg#g\'|bash

    注:1.bash的作用,执行前面管道后输出的内容

   2.& 表示前俩个#号中间正则匹配到的所有内容

   3.\\1 表示前面()中的内容

 

方法二:把以txt结尾的文件,中的txt替换成jpg

  [root@georgekai ~]# rename txt jpg old*.txt

  [root@georgekai ~]# ls

  oldboy01.jpg  oldboy04.jpg  oldboy07.jpg  oldboy10.jpg

  oldboy02.jpg  oldboy05.jpg  oldboy08.jpg  person.txt

  oldboy03.jpg  oldboy06.jpg  oldboy09.jpg

格式

  rename     form          to             file

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

              jpg                      avi                       *.jpg

1.1.6 使用sed命令的常见问题

 1. -r与-i同时使用

  -ri (正常):先使用扩展正则,在修改文件内容

  -ir :先备份文件名为“什么什么r”的备份文件,然后在替换源文件中的内容

 2. -i禁止与-n一起使用

  如:sed -ni \'1p\' person.txt  会把源文件内容清空,只留下第一行

 

以上是关于浅谈sed的主要内容,如果未能解决你的问题,请参考以下文章

浅谈sed用法

sed 编辑器的选项用法浅谈

Linux的文本处理工具浅谈-awk sed grep

浅谈awk命令

浅谈Yolo

转载:浅谈Cgroups