概述
基本命令格式:
sed 选项 '命令' 文本
选项主要有:
-n : 取消默认输出。当使用-n参数时,文本不会被打印到屏幕上。可以配合使用p参数,将匹配到的内容打印到屏幕上。
-e:允许执行多个脚本
-f:指定执行脚本
-i:修改原始文件内容
-r:在脚本中使用扩展表达式
命令:
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
s :替换,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;a :追加, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
由上可知sed主要用于文本的追加、替换、删除、插入等。
下面示例的文本为score.txt的文件:
NAME NO. MATH ENGLISH COMPUTER TOTAL
---------------------------------------------
Marry 2143 78 84 77 239
Jack 2321 66 78 45 189
Tom 2122 48 77 71 196
Mike 2537 87 97 95 279
Bob 2415 40 57 62 159
---------------------------------------------
1- 匹配文本
1.1- 定位文本行
#匹配第一行
sed -n '1 p' score.txt
#匹配最后行
sed -n 'n p' score.txt
#匹配第1-3行
sed -n '1,3 p' score.txt
#匹配奇数行
sed -n '1,2 p' score.txt
#匹配偶数行
sed -n '0,2 p' score.txt
#匹配第1行后面的5行内容,即1-6行
sed -n '1,+5 p' score.txt
1.2- 正则匹配文本
正则匹配和shell的基本一样,只是需要将正则表达式内容放到“/.../”内,示例:
sed -n '/正则表达式/' 文本
正则匹配字符也一样,只是需要注意的是,对于+、?、{、}是特殊字符,在正则表达式内需要转义,例如使用+匹配,需要这样写:
#匹配7出现至少一次的行
sed -n '/7\+/' 文本
简单些几个示例命令:
#匹配7出现3次及以上的行
sed -n '/7\{3,\}/ p' score.txt
#匹配以T开头的行
sed -n '/^T/ p' score.txt
#匹配包含T或M的行
sed -n '/[TM]/ p' score.txt
2- 替换文本s
语法:
s/正则表达式/替换内容/flag
flag主要有:
g: 全局匹配,替换所有符合条件的字符
数字:替换第n个匹配到的内容,n为数字
p:替换第一个匹配到的字符,并将缓冲区输出到标准输出
空:替换第一个匹配到的字符
2.1- 简单应用
#将文中所有7替换为9
sed -n 's/7/9/g p' score.txt
sed -n 's/7/9/2 p' score.txt
sed -n 's/7/9/p' score.txt
sed -n 's/7/9/ p' score.txt
2.2- 综合应用
只在第1-3行中匹配
sed -n '1,3 s/7/9/g p' score.txt
&:引用匹配模式。
例如我们想匹配Tom,并将匹配到的内容替换为dev Tom,可以用&字符表示匹配模式中的内容
sed -n 's/Tom/dev &/g p' score.txt
\n。子串。
在正则表达式里用括号括起来表示一个子表达式。在替换字符中用\1,\2可以引用第1、2个子表达式
例如我们想数学、英语成绩统计反了,想颠倒过来。可使用下面方式。
sed 's/\(MATH\) \(ENGLISH\)/\2 \1/g ' score.txt
注意:在sed中括号需要用转义表达,\(;\)
3- 删除d
语法:
sed '正则表达式 d' 文件
其中正则表达式和1中匹配行、字符的匹配规则一样。
例如我们想删除第3行
sed '3 d' score.txt
4- 追加a(后插)
追加:在匹配到行内容后面一行添加
sed '正则表达式 a 插入的字符' 文件
这里的正则表达式和前面讲的一样
示例:
#在第三行后添加*
sed '3 a *********************************************' score.txt
#在Tom行后添加*
sed '/Tom/ a *********************************************' score.txt
5- 插入i(前插)
插入:在匹配到行内容前面一行添加
sed '正则表达式 i 插入的字符' 文件
这里的正则表达式和前面讲的一样
示例:
#在第三行前面添加*
sed '3 i *********************************************' score.txt
#在Tom行前面添加*
sed '/Tom/ i *********************************************' score.txt
比较看下a和i区别。
6- 组合命令
6.1- -e
语法:
sed -e '命令1' -e '命令2' -e '命令n' 文本
示例
先将文本中的7替换为9,然后打印第2、3行
sed -n -e 's/7/9/g ' -e '2,3 p' score.txt
6.2- 使用分号
语法:
sed -e '命令1;命令2;命令n' 文本
先执行命令1再执行命令2
示例
先将文本中7替换为9,然后在第3行后面插入97
sed -e 's/7/9/g;3 a 97' score.txt
6.3- 对同一区域执行多个子命令
语法:
sed '区域 {
操作1
操作2
操作n}' 文件
示例
对1-5行,先将Tom替换为tom,再在第3行后插入97,然后打印。
sed -n '1,5 {
s/Tom/tom/g
3 a 97
p}' score.txt