sed     stream   edit  非交互式 对文件做编辑的工具

语法格式
sed   [选项]  '动作'   文件列表
sed   [选项]  '条件动作'   文件列表

以行为处理单位  一次处理一行  逐行处理
默认把处理结果输出到屏幕

+++++++++++++++++++++++++++++++++++++++++++++++

选项:

-n    #屏蔽默认输出

-i  直接修改文件内容

-f 使用sed脚本

+++++++++++++++++++++++++

vim  test.sed

s/haha/xixi
s/[0-9]//g
........

:wq

sed  -f   test.txt    a.txt     

+++++++++++++++++++++++++
-e 可指定多个处理动作

-r  启用扩展的正则表达式,若与其他选项一起用应作为首个选项

{}  可组合多个命令,以分号分隔

处理动作:

p打印行

2,4p  输出第234行

2p;4p 输出第2和第4行

d删除行 (删除一行)

2,4d 删除第234行

s 字符串替换

s/old/new  将每行的第一个old替换为new

s/old/new/3  将每行的第3个old替换为new

s/old/new/g  将所有的old替换为new

++++++++++++++++++++++++++++++++++++++++++++ 

p打印行
 sed 'p' a.txt               输出所有行不屏蔽默认输出(出现两遍内容)
 sed -n  'p' a.txt            输出所有行 sed -n  '3p' a.txt
 cat -b a.txt 
 sed  -n '3p' a.txt            输出第三行
 sed  -n '3,5p' a.txt           输出345行
 sed  -n '$p' a.txt               输出最后一行
 sed  -n '1p;5p;$p' a.txt      输出1,5,和最后一行
 sed  -n '/^r/p' a.txt      输出以r开头的行
 sed  -n '/h$/p' a.txt     输出以h结尾的行
 sed  -n '/h/p' a.txt         输出带h的行

sed -n 'p;p;p' a.txt        把每行内容输出3次

 sed -n '3,+10p'  a.txt  输出第3行及其后10行的内容

sed -n  'p;n' a.txt       输出奇数行,n表示读入下一行文本(隔行)

sed -n 'n;p' a.txt       输出偶数行,n表示读入下一行文本(隔行)

sed  -n  '$='   a.txt            输出文件的行数

sed -n  '10,${n;p}' a.txt   输出第10行到最后一行所有的偶数行

---------------------------------------------------------------------
d删除行 (删除一行)  不带-i不修改原文件

 sed  '1d'  a.txt    删除第一行
 sed  '$d'  a.txt    删除最后一行
sed  '1,3d'  a.txt   删除第123行
sed  '/r/d'   a.txt  删除包含r的行

sed '/r/!d' a.txt    删除不包含r的行

sed '/^r/d' a.txt    删除以r开头的行

sed   '/^$/d'  a.txt   删除所有空行

sed  '/^$/{n;/^$/d}'   删除重复空行,连续两个空行只保留一个

 sed  '/^[rds]/d' a.txt   删除分别以r,d,s开头的行
 sed  -i   '$d' /etc/passwd  删除文件的最后一行,修改原文件
----------------------------------------------------------------------
a/i添加行  (添加一行)
a  在当前行下方添加新行
i   在当前行上方添加新行

sed   'a内容'  a.txt

  echo cccccccccccc > a.txt
   sed  'aFFFFFFFFF' a.txt    在没行的下方添加内容FFFF...
   sed  'iFFFFFFFFF' a.txt   在没行的上方添加内容FFFF...
   echo 11111111 >> a.txt
   sed  '$aFFFFFFFFF' a.txt   在最后一行的下方添加
 sed  '1aFFFFFFFFF' a.txt   在第一行添加
  echo  ccccccccccc >> a.txt
 sed  '/^c/aFFFFFFFFF' a.txt     在以c开头的行添加
  sed  -i '/^c/aFFFFFFFFF' a.txt  在以c开头的行添加,修改原文件

 sed  -i '$ayzs:x:2001:2001:tea:/home/yzs:/bin/bash' /etc/passwd  在最后一行的上边添加内容

sed '1,3aF' a.txt    在第123行的上边添加
sed  -e 'aF' -e 'aX' -e 'aW' a.txt  在每行的上边分别都添加FXW,都隔行
--------------------------------------------------------------------
c替换行   (以行为替换单位)
sed   'c内容'   a.txt
sed   '条件c内容'   a.txt
  sed  'cPLJ' a.txt      把每行替换成PLJ
  sed  '1cPLJ' a.txt    把第一行替换成PLJ
 sed  '2,5cPLJ' a.txt  把第2345行替换成PLJ
 sed  -e '2cPLJ' -e '3cPLJ' a.txt   指定多个处理动作替换
 sed  -i  '/^a/cT' a.txt   把以a开头的行替换成T  -i处理原文件
--------------------------------------------------------------------
sed   's/aa/bb/'  a.txt  将每行的第一个aa 替换成bb

sed 's/aa/bb/3' a.txt 将每行的第3个aa 替换成bb

sed 's/aa/bb/g' a.txt 将所有的aa 替换成bb

sed 's/aa//g' a.txt 将所有的aa删除

sed 's/aa/&s/g' a.txt    将所有的aa 替换成aabb,&代表前边的查找串

sed  '4,7s/^/#/g'  a.txt 将第4-7行注释掉

sed   's/^an#/an/'  a.txt  去除以an开头行的注视

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

导入导出操作

 r  读取文件  :

3r b.txt 在第3行文件下方插入文件b.txt

sed  '3r b.txt'   a.txt

4,7r b.txt   在第4-7行每一行的下方插入文件b.txt

sed   '4,7r b.txt'   a.txt

w 保存到文件:

3w c.txt   将第3行另存到文件c.txt

sed   '3w c.txt'  a.txt

4,7w c.txt  将第4-7行另存到文件c.txt

sed    '4,7w c.txt'  a.txt

 

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

sed  复制剪切

基本动作

复制:   H:模式空间--追加--保持空间

               h:模式空间--覆盖--保持空间

粘贴:  G:保持空间--追加--模式空间

              g:保持空间--覆盖--模式空间

复制把文件1-2行复制到文件的末尾
sed  -n  '1h;2H;p'  a.txt

剪切
把文件1-2行剪切到文件的末尾
sed  '1h;2H;1,2d;$G' a.txt

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

后向引用   (-r  表示转义)
保存替换时的源数据,在替换时使用源数据做替换。最多用9个()
()()()()()()()()()
\1\2..............\9

    sed -r  '1s/(^.)(.*)/\1/' a.txt   把第一行替换成第一行的第一个字母
    sed -r  's/(^.)(.*)/\1/' a.txt      把所有行替换成每一行的第一个字母    
    sed -r  's/(^.)(.*)/\2/' a.txt       把每一行第一个字符去掉

    sed -r  '1s/(^.)(.*)(.$)/\3\2\1/' a.txt  把第一行第一个字符和最后一个字符对调

    sed -r  '1s/(^.)(.*)(.$)/\2/' a.txt     把第一行的第一个字符和最后一个字符去掉
    sed -r  '1s/(^.)(.*)(.$)/\1\3/' a.txt     只保留第一行的第一个字符和最后一个字符
    sed -r  '1s/(^.)(.*)(.$)/\1abc\3/' a.txt   把第一行第一个字符和最后一个字符保留并且中间加字母abc
    sed -r  's/(^.)(.*)(.$)/\1abc\3/' a.txt  把第每行的第一个字符和最后一个字符保留并且中间加字母abc    
    sed -r  's/(^.)(.*)(.$)/\2\3/' a.txt    把每行的第一个字符去掉

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
&  保存替换时的源数据
sed -r 's/^./[&]/' a.txt   把每行的第一个字符用[ ]扩起来

 sed '2s/lisi/&user/'  a.txt   把第二行的lisi后面加上字母user
 sed '2s/lisi/[&]/'  a.txt     把第二行的lisi用[ ]扩起来