Linux基础 ------- 文本处理利器sed

Linux文本处理利器 -- sed



Sed是UNIX/Linux系统上提供的将编辑工具自动化的编辑器,可以直接编辑文件。Sed以行为编辑
单位(行编辑器)。相比vim,gedit等编辑工具,Sed编辑文件只需要一条命名就可以解决很多的
问题,而且Sed对正则表达式的支持也非常好,的确是Linux下文本处理的利器。

1 使用方法

  1) sed OPTIONS... [SCRIPT] [INPUTFILE...]
           ---       ------------          -------------------   
            |           |                              |--------------被修改的文件,如果没有定义则结果会输出到标准输出中
            |           |-------------------------------------动作,定义sed具体的操作,通常为''或者""中的字符串
            |----------------------------------------------sed命令选项
     

2 常用参数说明(OPTIONS) 

  -n        | --quiet    | --silent    : 只有经过处理的行才显示在标准输出中
  -e script | --expression= script     : 加入一个动作来处理,多个动作使用多个此参数
  -f script-file  | --file=script-file : 使用文件中的sed动作
  -i[SUFFIX]      | --in-place[=SUFFIX]: 直接修改文件,而不输出到屏幕上
  -r        | --regexp-extended        : 使用扩展的正则表达式

3 如何写一个sed的动作(SCRIPT) -- ★重要★

  如何写一个sed动作,简单来讲就是
  ①定位 --> 在文本中选到某行或者某几行作为操作的范围
  ②操作 --> 对上述选中的行进行操作(输出、新增、删除、修改)
  ③结果 --> 对上述操作的结果进行处理(输出到屏幕、直接修改文件)
 

3.1 如何选中行

    number     : 直接指定行数  ----> sed -n '2p' 指定第2行(p参数为输出到屏幕,下同)
    first~step : 每step行中的第first行  ----> sed -n '1~2p' 每两行中的第一行,即奇数行
    $          : 最后一行
    /regexp/   : 匹配此正则表达式的行   ----> sed -n '/Ruby/p' 匹配所有含有Ruby字段的行
    addr1,+N   : addr1行和其后N行内容,'+'可以省略 ---->   sed -n '2,5p' 指定2到5行 
    addr1,~N   : addr1行和其后N的倍数行内容

3.2 如何进行操作 -- sed动作说明

   [n1[,n2]]   function
   function如以下的参数
    a  : 新增 --  选中行之后
    c  : 替换
    d  : 删除
    i  : 插入 -- 选中行之前
    p  : 打印
    s  : 替换,通常搭配正则表达式  --> 5,10s/old/new/g 

3.3 关于sed的其他方面

   1) 如何在sed中使用shell的变量
      sed动作字符串使用双引号即可
      如 : 
      var="insert a line"
      sed "1a $var"

   
   2) sed的结果传递给shell

     var=`cat /etc/passwd | sed -n '2,5p'`


4 一些例子

  1) 新增

      sed -i '1a insert a line' test  -- test文件第一行后新增
      sed -i '/test/a insert a line' tes  -- test文件中含有test字段的行后面增加一行

  2)删除

      sed -i '2,5d' test  -- 删除test文件的2到5行内容
      sed -i '/test/d' test  -- 删除test文件中含有test字段的行

  3)替换 ★重要★

     命令格式 : sed 's/要被替换的字符串/新字符串/g'
      sed -i 's/test/this is a replace/g' test -- 将test文件中test字段替换成成新的字段 (替换字符串)
      cat /etc/man.config | grep "MAN" | sed 's/^#.*$//g'  -- 删除所以以#号开头的注释行 (删掉整行)
      cat /etc/man.config | grep "MAN" | sed 's/^$//g'     -- 删掉空白行
    捕获
    sed -i 's/^test/&this is a new/' test    -- 在test字符串后新增字符串(&代表所有捕获的字符串)
    sed -i 's/^test\(.*\)$/\1this is a new/' test    -- 将test替换成this is a new '\1'代表'\(\)'括号里面捕获的字符串,这里的括号需要转义

  4)命令组合,使用shell命令

    sed -i -e "s/^\(DEVICE=\).*$/\1eth1/g" -e "s/^\(HWADDR=\).*$/\1$(cat /sys/class/net/eth1/address)/g" /etc/sysconfig/network-scripts/ifcfg-eth1
    说明 : ①一个 -e 后接一个sed动作,多个 -e 接多个动作
           ②可以在sed动作中使用shell的命令 $(cat /sys/class/net/eth1/address),但是命令必须要在双引号之间

  5)文件读写 r 和 w

    sed '/test/r file' test --- file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。   
    sed -n '/test/w file' test --- 在test中所有包含test的行都被写入file里。

  6) 保持和互换:h命令和x命令      

    sed -e '/test/h' -e '/check/x' test --- 现将含有test字段的行保存在缓冲区当中(h命令),再将含有check字段行替换成缓冲区的字符串(x命令)。实际作用就是交换两行的内容。

附录:sed中的元字符(使用于正则表达式)
   ^      : 行开头   
   $      : 行结束   
   .      : 任意非换行字符  
   *      : 零个或多个字符 如/.*/  
   []     : 匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。   
   [^]    : 不匹配指定范围的字符,与[]相反   
   \(..\) : 捕获组 
   &      : 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。    
   \<     : 锚定单词的开始,如:/\    \>     : 锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行。    
   x\{m\} : 重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。    
  x\{m,\} : 重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。    
  x\{m,n\}: 重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。

你可能感兴趣的:(Linux,系统管理,linux,sed,正则表达式,shell)