sed的工作机制

来源:互联网 发布:新西兰留学知乎 编辑:程序博客网 时间:2024/06/11 01:58
1.sed工作机制  
  sed处理文本文件时,首先会被读到模式空间中,而不修改原文件。sed可以对文本文件的所有行进行操作,也可以通过正则表达式进行匹配,使得sed可以只处理模式空间中的被正则表达式匹配到的行。

    然后再判断模式空间中的文本是否会被正则表达式匹配到,如果匹配到,就会对匹配到的文本做编辑操作,之后再将被编辑的文本和没有被编辑的文本一同输出到标准输出

    如果模式空间没有被正则表达式匹配到,直接将没有被匹配到的文本原样输出至标准输出
 
   1.用法格式
    1: sed 【选项】 脚本 文件
      2: 脚本组成:  地址定界 编辑命令  
      3: 常用的一些命令选项  
             -n:不输出模式中的内容至屏幕,也就是不会将没有匹配到的文本输出到标准,只是输出编辑到的文本
             -e: 脚本:可以指定多个脚本,实现多次编辑
             -f: 脚本文件 :每一行一个编辑命令
             -i:直接修改文件
             -r:表示使用扩展的正则表达式
      2.地址定界  
        地址定界(与vim的末行模式类似)
    (1)全文匹配:不需要给定地址,表示全文匹配,而vim需要给定%表示全文匹配
    (2)单地址匹配:写一个数字即可,例如:8表示匹配第8行
    (3)多地址匹配:给定一个范围,
        例如:1,9 表示匹配第1行到第9行
        例如:1,+2 表示匹配第一行到第三行
    (4)模式匹配:
        例如:/正则表达式/  表示正则表达式匹配到的行
        例如:1,/正则表达式/ 表示从第一行到正则表达式匹配到的行
    (5)步长匹配
        例如:1~2  表示所有奇数行
        例如:2~2  表示所有偶数行
    3.编辑命令  
  其实编辑命令 与 vim的末行模式类似    d命令是特例,需要特别注意,不能加-n 选项
 下面是一些命令的使用以及例子:
(1)[root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '1,2d' wqp
789
  qwe
asd
   zxc
d: 删除,对应d命令来说,不要安装sed的工作机制去理解,原因是对应d命令而言,没有匹配到的文本是不会输出到标准输出的。例如:下面的sed对yhy文件进行处理,不会将没有匹配到文本的输出至标准输出,而是将编辑后的文本输出到标准输出
  继续拿上面的例子来说
sed '/^[[:space:]]\+/d' wqp
123
789
asd
注意:上述的 不要认为是正则表达式  正则表达式的话 sed 后面一般都要加上  -r  ^[[:space:]]\+ 其中 “^” 是托字符 其中的含义是表示 以空白格开头的行 “ \+” 中 “\”表示转义符 “+”表示一个或者多个 前面加上这个转义符号 才能使用
(2)p: 打印
 一定要-n选项,如果不加-n那么打印的行将会显示两遍
 [root@localhost /]# sed -n '1,3p' wqp
123
  456
789
[root@localhost /]# sed  '1,3p' wqp
123
123
  456
  456
789
789
  qwe
asd
   zxc
可以根据上面的常用命令的选项 来理解
(3)a\字符串:在行后面追加字符串,支持使用\n实现多行追加  
   [root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '2a\www' wqp
123
  456
www
789
  qwe
asd
   zxc
(4)i\字符串:在行前面插入字符串,支持使用\n实现多行插入
[root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '2i\www' wqp
123
www
  456
789
  qwe
asd
   zxc
(5)c\字符串:把匹配到的行替换为字符串
[root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '2c\www' wqp
123
www
789
  qwe
asd
   zxc

(6)w 文件路径:将匹配到的行重定向至指定的文件中  
例如:sed '/^[^#]/w yhy.txt' /etc/fstab  将非井号开头的行保存至yes.txt文件中
 (7)r 文件路径:读取指定文件的内容插入到当前文件被匹配到的行处
[root@localhost /]# cat www
123
123
456
789
000
[root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '3r/www' wqp
123
  456
789
123
123
456
789
000
  qwe
asd
   zxc
(8)=:表示被模式匹配到的行上面加上一个行号
[root@localhost /]# cat wqp
123
  456
789
  qwe
asd
   zxc
[root@localhost /]# sed '/^asd/=' wqp
123
  456
789
  qwe
5
asd
   zxc
(9)!:取反条件  
例如:sed '/^#/!d' /etc/fstab   将不是以#好开头的行删除
(10)s///:查找替换,常用的有s@@@, s### ,
    修饰符有:
        g:全局替换,表示可以替换一行中多次匹配到的字符串。如果不加g,那么只能替换一行中第一次出现的字符串
        w 文件路径:替换成功的结果保存至指定文件中
        p :显示替换成功的行
3 练习
     1:删除/etc/grub2.cfg文件中所有的以空白字符开头的行的行首的所有空白字符

sed 's/^[[:space:]]\+//' /etc/grub2.cfg

    2:删除/etc/fstab文件中所有以#开头的行的行首的#号且紧跟#号后面的所有空白字符

sed -r 's/^#[[:space:]]*//' /etc/fstab

    3:输出一个绝对路径给sed命令,取出其文件名

 echo "/var/log/messages" | sed -r 's#^.*/(.*)#\1#'  正确
 echo "/var/log/messages" | sed -r 's/^.*/(.*)/\1/'  错误
 echo "/var/log/messages" | sed 's/^.*\/\(.*\)/\1/'  正确, 不用扩展正则表达式

    4:输出一个绝对路径给sed命令,取出其目录名,相当于dirname

 echo "/var/log/messasdfasdf/" | sed -r 's#(.*)/.*#\1#'   
  注意: 再上面的4题中可以得知 只是就自己个人观点 在加上自己动手时间操作观察得到的
   [root@localhost /]# sed -r  's/^[[:space:]]*//' wqp
123
456
789
qwe
asd
zxc
[root@localhost /]# sed   's/^[[:space:]]\+//'
^C
[root@localhost /]# sed   's/^[[:space:]]\+//'  wqp
123
456
789
qwe
asd
zxc

可以看出 上面一个使用了正则表达式 一个没有使用  但是结果相同  一个有转义符号的 没有加上 -r   带有 “*” 加上了-r  还有题中所加上的 * 表示 匹配到的 0,1,或多次   (个人看来 要加上 * 的一般都是扩展正则表达式)