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**/' 修改从模式root和www之间的所有行,将各行的行尾($)替换为字符串**end**
sed 's/[0-9][0-9]$/&.5/p' file 所有以两位数字结尾的行后面都被加上.5
y 将字符转换为另一个字符:
y <元字符><替换字符>
正则表达式元字符对y命令不起作用;
可以用不是换行的任何其他字符作为分界符;
元字符和替换字符的个数必须相同。
Sed '1,3y/abcdef/ABCDEF/' pass.txt 把第一行到第三行中小写字母转换成大写
三、保存和取回:
1、h 把模式空间里的内容拷贝暂存缓存区
Sed -e '/root/h' -e '$G' file 把包含root的行拷贝的缓冲区(只保存最后一次操作),并被追加到文件的最后一行
2、H 把模式空间里的内容追加到暂存缓存区
Sed -e '/root/H' -e '$G' file 把包含root的行追加到暂存区,并被追加到文件的最后一行
3、g 取出暂存缓冲区的内容,将其拷贝到模式空间,覆盖该处原有的内容
Sed -e '/root/{h;d;}' -e '/admin/{g;}' 把包含root的行拷贝到暂存空间,删除改行,然后替换掉文件中包含admin的行
4、G 取出暂存缓存区的内容,将其拷贝的模式空间,追加到原有内容后面
Sed -e '/root/{h;d;}' -e '$G' file 把包含root的行拷贝到暂存空间,并且删除,然后被追加到文件的最后一行
5、x 交互暂存缓冲区与模式空间的内容
Sed -e '/root/h' -e '/admin/x' file 包含root的行被包含admin的行替换
注意:模式空间:模式匹配的范围,一般而言,模式空间是输入文本中某一行,但是可以通过使用N函数把多于一
行读入模式空间。
暂存缓冲区:holding buffer一个特殊的缓冲区
四、输入、输出
1、p 打印行:
Sed -n '/root/p' file 与-n参数配合使用只打印符合条件的行
Sed -n '/root/,/admin/p' file 打印在模式root和admin之间的所有行
Sed -n '5/root/p' file 打印从第五行到第一个以root开头的行之间的所有行
2、r 从文件中读取输入行:
Sed '/root/r newfile.txt' file 在文件file中匹配到模式root就在该文件中读入文件newfile.txt
3、w 将行写入文件:
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 删除root和admin之间的空行,把包含www的行拷贝到暂存空间并删除
3、n读入下一输行,并从下一条命令,而不是第一条命令开始对其操作:
Sed '/root/{n;s/admin/www/;}' file 当匹配到模式root后就跳入下一行进行s替换
4、标签函数:
: lable 建立命令标记,配合b,t函数使用跳转
b lable 分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。
t labe 判断分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令出,或者到脚本末尾。
与b函数不同在于t在执行跳转前会先检查其前一个替换命令是否成功,如成功,则执行跳转。
T lable错误分支,从最后一行开始,一旦发生错误或者F,T命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
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 列出非打印字符