sed编辑命令模式:引用shell变量时要使用双引号,而不是普通单引号。

sed脚本模式:

1、脚本是一个sed的命令清单

2、在命令末尾不能有任何空白或文本

3、如果再一行中有多个命令,要用分号分隔

4、不需要且不能用引号保护命令

5、以#开头的行为注释行,且不能跨行。

-n   不输出所有,只复制p函数或者在s函数后p标志所指定的行

-e   下一个参数接受为编辑命令,允许多项编辑。

-i    直接修改目标文本

-f    把下一个参数接受为脚本名,文件每行一个编辑命令

Sed 函数应用:

一、插入、修改、删除

 a\      在当前行后添加一或多行 

sed '/root/a\My name is  lianghaiqiang.' pass.txt

sed "/root/a\my name is lianghaiqiang.\nWhat's your name" pass.txt  添加多行

 i\       在当前行前添加一或多行

 c\      新文本修改(替换)当前行的文本sed '/\

 d        删除行;sed  '3d'  file  删除第三行       

二、查找、替换:

 s   用一个字符替换另一个:

  s <模式><替代><标志>

模式:包含一个模式,可以用不是空格或者换行的任何其他字符来作为分界字符;

              默认只替换匹配模式的第一个字符。

替代:紧接着<模式>第二个分界字符之后开始,必须立即跟随分界符;

             <替代>不是模式,在模式中有特殊意义的字符在<替代>中没有意义;

            有特殊意义的字符:1&被替代为匹配<模式>的字符串2\d(这里的d是一个单一的数字)被替换为同<模式>中第d个包围在'\(''\)'内的           部分相匹配的字串。

标志:g把此行中<模式>的所有(不重叠)的实例都替换为<替代>

             p打印此行(如果做了成功的替换)

             w把此行写入到一个文件中(如果做了成功的替换)

sed  's/root/administrator/g' pass.txt 将root替换成administrator,命令末端的标志g表示全局替换

 sed    's#root#administrator#g'  pass.txt   使用#替换默认分割符/,仅在使用s命令时。

Sed     '/root/,/www/s/$/**end**/' 修改从模式rootwww之间的所有行,将各行的行尾($)替换为字符串**end**

  sed   's/[0-9][0-9]$/&.5/p'  file     所有以两位数字结尾的行后面都被加上.5

 y 将字符转换为另一个字符:

   y <元字符><替换字符>

   正则表达式元字符对y命令不起作用;

   可以用不是换行的任何其他字符作为分界符;

   元字符和替换字符的个数必须相同。

Sed '1,3y/abcdef/ABCDEF/' pass.txt 把第一行到第三行中小写字母转换成大写

 

三、保存和取回:

  1h 把模式空间里的内容拷贝暂存缓存区

Sed -e '/root/h' -e '$G'  file  把包含root的行拷贝的缓冲区(只保存最后一次操作),并被追加到文件的最后一行

  2H  把模式空间里的内容追加到暂存缓存区

Sed -e '/root/H' -e '$G' file  把包含root的行追加到暂存区,并被追加到文件的最后一行

  3g   取出暂存缓冲区的内容,将其拷贝到模式空间,覆盖该处原有的内容

Sed -e '/root/{h;d;}' -e '/admin/{g;}'  把包含root的行拷贝到暂存空间,删除改行,然后替换掉文件中包含admin的行

  4G  取出暂存缓存区的内容,将其拷贝的模式空间,追加到原有内容后面

Sed -e '/root/{h;d;}' -e '$G' file   把包含root的行拷贝到暂存空间,并且删除,然后被追加到文件的最后一行

  5x  交互暂存缓冲区与模式空间的内容

Sed -e '/root/h' -e '/admin/x' file  包含root的行被包含admin的行替换

注意:模式空间:模式匹配的范围,一般而言,模式空间是输入文本中某一行,但是可以通过使用N函数把多于一

行读入模式空间。

            暂存缓冲区:holding buffer一个特殊的缓冲区

四、输入、输出

 1p 打印行:

Sed  -n '/root/p' file  -n参数配合使用只打印符合条件的行

Sed -n '/root/,/admin/p' file  打印在模式rootadmin之间的所有行

Sed -n '5/root/p'   file  打印从第五行到第一个以root开头的行之间的所有行

2r 从文件中读取输入行:

Sed '/root/r  newfile.txt' file 在文件file中匹配到模式root就在该文件中读入文件newfile.txt

3w 将行写入文件:

sed '/root/w qq.sh'  file  把文件file中匹配到模式root的行写入文件qq.sh(qq.sh可存在并覆盖以前文件,若不存在就新建)

Sed '5w  qq.sh'  file   把文件file的第三行写入到文件qq.sh 

五、控制流:

1!对所选行以外的所有行应用命令:

Sed -n '/root/!d'   只保留包含root的行

2{}组合命:

       一组命令作为一个块而被应用,函数命令之间用分号分割,组合可以嵌套

Sed -n '/root/,/admin/{/^*/d;/www/{h;d;}}' file 删除rootadmin之间的空行,把包含www的行拷贝到暂存空间并删除

3n读入下一输行,并从下一条命令,而不是第一条命令开始对其操作:

Sed  '/root/{n;s/admin/www/;}' file  当匹配到模式root后就跳入下一行进行s替换

4、标签函数:

 :  lable  建立命令标记,配合bt函数使用跳转

 b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

 t labe  判断分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令出,或者到脚本末尾。

  b函数不同在于t在执行跳转前会先检查其前一个替换命令是否成功,如成功,则执行跳转。

 T lable错误分支,从最后一行开始,一旦发生错误或者FT命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

Sed -e '{:p1;/A/s/A/AA/;/B/s/B/BB/;/[AB]\{40\}/b;b p1;}' file

 文件file内容是第一行A第二行B;建立标签p1;两个替换函数;A替换成AA,B替换成BB;当A或者B达到40个以后调用b

不带标签,跳转到最后结束循环;表用b p1跳转到开始循环执行两个替换操作。

5、多输入行:提供跨越输入中的行的模式匹配。

D 删除当前模式空间中直到并包含第一个换行符的所有字符。

N 追加下一个输入行到模式空间后面并在第二者间嵌入一个换行符,改变当前行号码,

    模式匹配可以延伸跨域这个内嵌换行

 p 打印模式空间中的直到并包含第一个换行的所有字符 

6、其他操作:

= 向标准输出写入匹配它的地址的行号

 q 结束或者退出sed

 l  列出非打印字符