sed命令

linux三剑客之一,一种非交互式的流编辑器,可直接修改源文件

参数

-e		可以指定多个命令
-f		指定命令文件		
-n		取消默认控制台输出,与p一起使用可打印指定内容
-i		输出到原文件,静默执行(修改原文件的意思)	

command

a		新增
c		替换,整行
d		删除
i		插入
p		打印,要和-n参数一起使用
s		替换(匹配局部替换)
		sed  's/pattern/replacement/flags'
		flags标记功能
			n   表示1-512之间的数字,表示指定替换的字符串出现的第几个位置
			g   对所有匹配到的内容进行替换,没有则默认只替换第一个
			p   打印匹配的行,与-n结合使用
			w   将缓冲区的内容写到指定文件中
			&   用正则表达式匹配的内容进行替换
			=   打印行号
y	 字符按照一对一的方式从左到右进行转换
r	 扩展匹配,默认只支持基本正则表达式,将独立的文件内容插入到当前内容指定位置
h	 拷贝模板块的内容到内存中的缓冲区。
H    追加模板块的内容到内存中的缓冲区。
g	 获得内存缓冲区的内容,并替代当前模板块中的文本。
G	 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
x	 交换模式空间与保持空间的内容

通配符

	^	 行首定位符	 /^my/  匹配所有以my开头的行
	$	 行尾定位符	 /my$/  匹配所有以my结尾的行
	.	 匹配除换行符以外的单个字符	 /m..y/  匹配包含字母m,后跟两个任意字符,再跟字母y的行
	*	 匹配零个或多个前导字符	 /my*/  匹配包含字母m,后跟零个或多个y字母的行
	[]	 匹配指定字符组内的任一字符	 /[Mm]y/  匹配包含My或my的行
	[^]	 匹配不在指定字符组内的任一字符	 /[^Mm]y/  匹配包含y,但y之前的那个字符不是M或m的行
	&	 保存查找串以便在替换串中引用	 s/my/**&**/  符号&代表查找串。my将被替换为**my**
	\<	 词首定位符	 /\<my/  匹配包含以my开头的单词的行
	\>	 词尾定位符	 /my\>/  匹配包含以my结尾的单词的行
	x\{m\}	 连续m个x	 /9\{5\}/ 匹配包含连续5个9的行
	x\{m,\}	 至少m个x	 /9\{5,\}/  匹配包含至少连续5个9的行
	x\{m,n\}	 至少m个,但不超过n个x	 /9\{5,7\}/  匹配包含连续5到7个9的行

POSIX字符类

	[[:upper:]]   表示大写字母[A-Z]
	[[:lower:]]   表示小写字母[a-z]
	[[:digit:]]   表示阿拉伯数字[0-9]
	[[:alnum:]]   大小写字母和数字[0-9a-zA-Z]
	[[:space:]]   表示空格或Tab键
	[[:alpha:]]   大小写字母[a-zA-Z]
	[[:cntrl:]]   表示ctrl键
	[[:graph:]]或[:print:]   ASCII中33-126之间的字符
	[[:xdigit:]]   16进制数字
	[[:punct:]]    匹配标点符号
	[[:blank:]]    匹配空格或制表符

增加a、i、r

	指定位置行前a
	sed '2a newline'   test.txt       #在第二行后面增加一行内容
	sed '1,3a newline'  test.txt      #在1到3行每行后面增加一行内容
	sed '1,+4a 新行字符串'  test.txt    #从第一行开始向下4行进行追加
	sed '1~2a 新行字符串'   test.txt    #从第一行开始开始向下+2行进行追加
	指定位置行后i
	sed '2i testContent' test.txt      #在第 2 行前面插入一行内容
	sed '1,3i testContent' test.txt    #在原文的第 1~3 行前面各插入一行内容
	sed '3r data.txt' test.txt         #将data.txt文件内容插入test.txt内容中的第3行后
	sed -i '/指定字符串/a 新行字符串'  test.txt   #指定字符串行后插入新行

替换c、s、y、w

	sed '2c testContent' test.txt     #将第 2 行内容整行替换
	sed '1,3c testContent' test.txt   #将第 1~3 行内容替换成一行指定内容
	sed 's/old/new/' test.txt         #匹配每一行的第一个old替换为new
	
	sed 's#old#new#' test.txt
		#分隔符默认为正斜杠,无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
		
	sed '2s/old/new/' test.txt      #替换指定第二行的匹配内容,只换第一处
	sed 's/old/new/1' test.txt      #替换第一个匹配的位置
	sed 's/.//2;s/.$//'  test.txt   #删除文件中每行第二个和最后一个字符
	sed '/key/s//old/new/'  test.txt  #先匹配关键字符串行,再替换匹配内容
	sed 's/old/new/gi' test.txt     #匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写
	sed '3,9s/old/new/gi' test.txt  #匹配第 3~9 行所有old替换为new
	
	sed -n '2,3s{/cn/china/;/ou/ye/}'  test.txt     #将第2行到第3行之间匹配的进行替换,相当于执行多条命令
	sed '/key/ {s/[0-9]+/356/g}' test.txt           #将匹配行的数字进行替换
	echo "this is a test line" | sed 's/\w+/[&]/g'  #正则匹配,&对应于之前所匹配到的单词
	
	sed '1,20y/abc/ABC/'  test.txt        #单独处理单个字符,对应替换
	sed 's/old/new/w new.txt'  test.txt   #将匹配后的内容保存在new.txt文件中

删除d

	sed '2d' test.txt      #删除第 2 行
	sed '1,3d' test.txt    #删除第1~3行
	sed '/1/,/3/d'  test.txt     #删除1~3行
	sed '5,$d'  test.txt   #删除从第5行开始到结束的行
	sed '/My/,/You/d'  test.txt  #删除包含'My'到'You'的行
	sed '3d;4d;7d'         #删除3、4、7行,多个条件用;隔开
	sed 'd'  test.txt      #删除所有行
	sed '/^$/d'  test.txt  #删除空行

打印p、n

	sed '2p' test.txt        #重复打印第 2 
	sed '1,2=' test.txt      #将行号打印出来
	sed '1,3p' test.txt      #重复打印第1~3行
	sed -n '2p' test.txt     #只打印第 2 行
	sed -n '1,3p' test.txt       #只打印第 1~3 行
	sed -n '/user/p' test.txt    #打印匹配到user的行,类似grep
	sed -n '/user/!p' test.txt    #! 反选,打印没有匹配到user的行
	sed -n 's/old/new/gp' test.txt    #只打印匹配替换的行
	sed -n '/^a/p;/^b/p'  test.txt    #打印以a开头和以b开头的行
	sed -n 'n;p'  test.txt   #打印偶数行,或者"2~2p"
	sed -n 'p;n'  test.txt   #打印奇数行,或者"1~2p"
	sed -n '$=' test.txt     #输出文件的总行数,同wc -l(会输出文件名)

参数-e

	sed -e 's/88/66/g' -e '2d' test.txt    #执行多个指令

参数-f

	sed -f ab.log test.txt   #多个命令写进ab.log文件里,一行一条命令,效果同-e

综合

	sed -r 's/^(.)(.)(.*)/\2\1\3/' test.txt    #将文件中每行的第一个、第二个字符互换
	sed -r 's/[0-9]//g;s/^( )+//' test.txt     #删除所有数字和行首空格
	sed 's/[A-Z]/(&)/g'  test.txt           #为文件中每个大写字母添加括号,&表示前面匹配的字符串内容
	sed -r "s/([A-Z])/(\1)/g"  test.txt     #同上
	echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^/]+\/?$)/\2/'       #提取后面目录
	ls /Packages | sed -r 's/(.*\.)([^.]+)(\.rpm$)/\2/' | sort | uniq -c    #统计rpm包个数

复制剪切,复制(H追加,h覆盖)、粘贴(G追加,g覆盖)

	sed 'G'  test.txt   #在每行后面都插入空白行
	sed '$!G'  test.txt  #末行不加空白行
	sed '1,3H;$G'  test.txt   #将1-3行复制到文件末尾
	sed '1h;2,3H;$G'  test.txt  #可避免出现空行(出现空行的原因是保持空间内默认已有一个空行)
	sed '2H;4G' test.txt   #把第2行复制第4行,追加出现空行
		sed '2h;4G' test.txt   #不要空行
	sed '1h,1d;$G'  test.txt     #把第1行剪切到文件末尾
	sed '1h;2H;1,2d;$G'  test.txt  #把第1-2行剪切到文件末尾
	sed '22h;23,33H;56G'  test.txt   #把文件从第22行到第33行复制到56行后面
	sed '22{h;d};23,33{H;d};56g'  test.txt    #把文件从第22行到第33行移动到第56行后面
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值