sed命令总结

来源:互联网 发布:c语言基础教程电子书 编辑:程序博客网 时间:2024/05/16 07:08
    sed是一种非交互式流式编辑器,是英文stream editor的缩写。其工作原理为把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。其语法如下:sed [OPTION] 'AddressCommand' file ...OPTION-n: 静默模式,不再默认显示模式空间中的内容-i: 直接修改原文件-e SCRIPT -e SCRIPT:可以同时执行多个脚本-f /PATH/TO/SED_SCRIPTsed -f /path/to/scripts  file-r: 表示使用扩展正则表达式Address:1、StartLine,EndLine比如1,100$:最后一行2、/RegExp//^root/3、/pattern1/,/pattern2/第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行4、LineNumber指定的行5、StartLine, +N从startLine开始,向后的N行;Commandd: 删除符合条件的行;p: 显示符合条件的行;a \string: 在指定的行后面追加新行,内容为string\n:可以用于换行;i \string: 在指定的行前面添加新行,内容为string;r FILE: 将指定的文件的内容添加至符合条件的行处;w FILE: 将地址指定的范围内的行另存至指定的文件中;y/source/dest/:将source中的字符一一替换成dest中的字符,与tr命令类似;s/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串修饰符g: 全局替换i: 忽略字符大小写;s///分隔符自由替换: s###, s@@@;下面详细介绍Addresss和Command的具体含义,并给出示例。Address选项会涉及正则表达式,因此顺带介绍元字符和POSIX字符类。Address:1、LineNumber指定的行$:最后一行#打印第2行:sed -n '2p' file.txt#打印最后一行:sed -n '$p' file.txt#打印所有行(此时LineNumber可省略):sed -n 'p' file.txt2、StartLine,EndLine比如1,100#打印1-5行:sed -n '1,5p' file.txt#打印3-最后一行:sed -n '3,$p' file.txt3、StartLine, +N从startLine开始,向后的N行;#打印第三行及之后的2行:sed -n '3,+2p' file.txt4、FirstLine~N从FirstLine开始,以及之后的FirstLine+n*N(n=1,2,3...)行;#只打印偶数行:sed -n '0~2p' file.txt#只打印奇数行:sed -n '1~2p' file.txt(注:不要和man手册里的addr1,~N搞混了)5、/pattern1/,/pattern2/第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束,这中间的所有行#打印以abc开头的行和以xyz结尾的行之间的行:sed -n '/^abc/,/xyz$/p' file.txt6、/RegExp/正则表达式,这里只简单介绍元字符集和POSIX字符类。
正则表达式之元字符集
元字符集可分为四类:匹配单个字符的,提供计数功能的,匹配位置的及其他元字符。匹配单个字符的元字符. 点号:匹配单个任意字符#匹配类似get/got之类的在g和t之间有一个字母的单词:#sed -n '/g.t/p' efile.txt[...]字符组:匹配单个列出的字符#匹配一个指定范围内的字符,如/[Gg]et/匹配Get和get:sed -n '/[Gg]et/p' efile.txt[^...]排除型字符组:匹配单个未列出的字符#匹配不包含Get和get的行:sed -n '/[^Gg]et/p' efile.txt\char 转义字符 若char是元字符,或转义序列无特殊含义时,匹配char对应的普通字符#匹配g.t这样的普通字符串:sed -n '/g\.t/p' efile.txt提供计数功能的元字符? 问号 容许匹配一次,但非必须#匹配colour/color(请注意-r选项):sed -r -n '/colou?r/p' file.txt* 星号 可以匹配任意多次,也可能不匹配#匹配get/got/goot/gt:sed -n '/g*t/p' efile.txt+ 加号 至少需要匹配一次,至多可能任意多次#匹配以@开头的行,在@之前可以有一个或多个空格(请注意-r选项):sed -n -r '/^[[:space:]]+#/p' file.txt{min,max} 区间量词 至少需要min次,至多容许max次#x\{m\} 重复字符x,m次:sed -n '/o\{2\}/p' efile.txt#x\{m,\} 重复字符x,至少m次:sed -n '/o\{2,\}/p' efile.txt#x\{m,n\} 重复字符x,至少m次,不多于n次(貌似不支持?!):sed -n '/o\{2,3\}/p' efile.txt匹配位置的元字符^ 脱字符 匹配一行的开头位置#以hello开头的行:sed -n '/^hello/p' file.txt$ 美元符 匹配一行的结束位置#以world结尾的行:sed -n '/world$/p' file.txt#空行:sed -n '/^$/p' file.txt\< 单词分界符 匹配单词的开始位置#锚定单词的开始,如:/\<love/匹配包含以love开头的单词的行\> 单词分界符 匹配单词的结束位置#锚定单词的结束,如/love\>/匹配包含以love结尾的单词的行其他元字符& 保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**| alternation 匹配任意分隔的表达式\1,\2,... 反向引用 匹配之前的第一、第二组括号内的字表达式匹配的文本(...) 括号 限定多选结构的范围,标注量词作用的元素,为反向引用”捕获”文本#将like、love替换成liker、lover:sed 's/\(l..e\)/\1r/' efile.txt#将like、love替换成Liker、Lover:sed 's/l\(..e\)/L\1r/' efile.txt#将字符串进行重组:AABBCCDDEEFF --> AA:BB:CC:DD:EE:FFecho AABBCCDDEEFF | sed 's/\(..\)\(..\)\(..\)\(..\)\(..\)\(..\)/\1:\2:\3:\4:\5:\6/'正则表达式之POSIX字符类POSIX字符类[[:alnum:]] 字母数字 [a-z A-Z 0-9][[:alpha:]] 字母 [a-z A-Z][[:blank:]] 空格或制表键[[:cntrl:]] 任何控制字符[[:digit:]] 数字 [0-9][[:graph:]] 任何可视字符(无空格)[[:lower:]] 小写 [a-z][[:print:]] 非控制字符[[:punct:]] 标点字符[[:space:]] 空格[[:upper:]] 大写 [A-Z][[:xdigit:]] 十六进制数字 [0-9 a-f A-F]#打印以空格开头的行:sed -n  '/^[[:space:]]/p' file.txtCommandd: 删除符合条件的行;#删除第2行:sed '2d' file.txtp: 显示符合条件的行;#打印1-5行:sed -n '1,5p' file.txti \string: 在指定的行前面添加新行,内容为string;#在第一行之前添加一行:sed '1i #!/bin/bash' file.txta \string: 在指定的行后面追加新行,内容为string\n:可以用于换行;#在最后一行之后添加版权信息:sed '$a copyright\n2015' file.txtr FILE: 将指定的文件的内容添加至符合条件的行处;#将efile.txt文件内容添加到file.txt的第一行后:sed '1r efile.txt' file.txtw FILE: 将地址指定的范围内的行另存至指定的文件中;#将file.txt的第3行到最后一行保存到tmp.txt文件:sed '3,$w tmp.txt' file.txty/source/dest/:将source中的字符一一替换成dest中的字符,与tr命令类似;#将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$:sed '1,20y/abc12/ABC^$/' efile.txts/pattern/string/修饰符: 查找并替换,默认只替换每行中第一次被模式匹配到的字符串加修饰符g: 全局替换i: 忽略字符大小写;#将第1行出现的第一个like替换成love:sed '1s/like/love/' efile.txt#将第1行出现的所有like替换成love:sed '1s/like/love/g' efile.txt#将第1行出现的所有like替换成love且不区分大小写:sed '1s/like/love/ig' efile.txt#将第1-3行出现的第一个like替换成love:sed '1,3s/like/love/' efile.txt#将所有行出现的所有like替换成love:sed 's/like/love/g' efile.txts///分隔符自由替换: s###, s@@@;
0 0
原创粉丝点击