sed命令总结

    sed是一种非交互式流式编辑器,是英文stream editor的缩写。其工作原理为把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
其语法如下:
sed [OPTION] 'AddressCommand' file ...
OPTION	-n: 静默模式,不再默认显示模式空间中的内容
	-i: 直接修改原文件
	-e SCRIPT -e SCRIPT:可以同时执行多个脚本
	-f /PATH/TO/SED_SCRIPT
		sed -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行;
Command	d: 删除符合条件的行;
	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.txt
2、StartLine,EndLine
	比如1,100
	#打印1-5行:sed -n '1,5p' file.txt
	#打印3-最后一行:sed -n '3,$p' file.txt
3、StartLine, +N
	从startLine开始,向后的N行;
	#打印第三行及之后的2行:sed -n '3,+2p' file.txt
4、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.txt
6、/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:FF echo 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.txt Command d: 删除符合条件的行; #删除第2行:sed '2d' file.txt p: 显示符合条件的行; #打印1-5行:sed -n '1,5p' file.txt i \string: 在指定的行前面添加新行,内容为string; #在第一行之前添加一行:sed '1i #!/bin/bash' file.txt a \string: 在指定的行后面追加新行,内容为string \n:可以用于换行; #在最后一行之后添加版权信息:sed '$a copyright\n2015' file.txt r FILE: 将指定的文件的内容添加至符合条件的行处; #将efile.txt文件内容添加到file.txt的第一行后:sed '1r efile.txt' file.txt w FILE: 将地址指定的范围内的行另存至指定的文件中; #将file.txt的第3行到最后一行保存到tmp.txt文件:sed '3,$w tmp.txt' file.txt y/source/dest/:将source中的字符一一替换成dest中的字符,与tr命令类似; #将1到20行内,所有的小写hrwang转换成大写,将1转换成^,将2转换成$:sed '1,20y/abc12/ABC^$/' efile.txt s/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.txt s///分隔符自由替换: s###, s@@@;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值