Linux三剑客:grep,awk 和 sed,从功能上来说分别对应了查找,分段,修改。
我们这里聚焦在字符串修改上。
命令含义
sed的全称是 `stream editor`, 它的作用是根据定位到的数据行修改数据。
sed的格式是 `sed [OPTION]... {script-only-if-no-other-script} [input-file]`。
option:
-n :使用安静(slient)模式。只有经过sed特殊处理的那一行(或者操作)才会被列出来。一般与p配合使用
-e expr1 -e expr2 -e expr3:直接在命令行模式上进行sed的动作编辑(add the script to the commands to be executed)
-f :直接将sed动作写在一个文件内,-f filename则可以执行filename 内的sed动作。
-r :sed的动作支持的是拓展正则表达式的语法(默认是基础正则表达式的语法)
-i[SUFFIX]:直接修改读取的文件内容,而不是由屏幕输出(如果提供了SUFFIX那么会做备份)
n1,n2: n1,n2不见得会存在,一般代表选择进行动作的行数,举例来说,如果我的动作是需要在10到20之间进行的,则“10,20[动作行为]”。
script:
function:
a :新增
d :删除 (比较重要,测试工作中对数据处理时可快速去除无用信息,比如注释行,空白行等)
i :插入
p :打印 (一般与-n配合使用)
s :替换(重中之重!!!,s参数可以说是日常测试工作中对数据用sed清理过滤时使用率最高的了)
举个例子:` sed 's/待修改/修改结果/' `
例子1
表达式单引号中的s表示修改,/ 符号表示分隔,实际上将/换成其他符号也可以,只要能起到分隔作用就OK
$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/'
aaa|BBB}|cccbbb --- 只换了第一个bbb
$ echo "aaa|bbb}|cccbbb" | sed 's/bbb/BBB/g'
aaa|BBB}|cccBBB --- 所有的bbb都换了
例子2
更换文本中所有的www为www3,同时做备份
样本数据
$: cat a
2 http: // www. e290cx. org/index.html
3 http: // www. e290cx. org/1.html
4 http: //post.e290cx. org/index.html
5 http: //mp3.e290cx. org/index.html
6 http: // www. e290cx.org/3.html
替换与备份的命令
sed -i.txt 's/www/www3/g' a
操作结果
$: sed -i.txt 's/www/www3/g' a
$: cat a
2 http: // www3. e290cx. org/index.html
3 http: // www3. e290cx. org/1.html
4 http: //post.e290cx. org/index.html
5 http: //mp3.e290cx. org/index.html
6 http: // www3. e290cx.org/3.html
$: cat a.txt
2 http: // www. e290cx. org/index.html
3 http: // www. e290cx. org/1.html
4 http: //post.e290cx. org/index.html
5 http: //mp3.e290cx. org/index.html
6 http: // www. e290cx.org/3.html
$:
例子3
将文本中每行末尾的 : 都替换成 @ ,将 a 替换成 A ,并在文本末尾加上“ Sed Test ”
扫描二维码关注公众号,回复:
15053126 查看本文章
样本数据
$ cat a
a:
b:
c:
d:
这里需要有多个操作,需要多次使用`-e expr` 添加指令,同时这里是文本末尾添加,不是每行都添加,所以要有文本末尾的标记`$`
使用命令(即时使用` -i [SUFFIX] `做备份是一个好习惯)
$ sed -i.bak -e 's/:$/@/g' -e 's/a/A/' -e '$aSed Test' a
操作结果
$ sed -i.bak -e 's/:$/@/g' -e 's/a/A/' -e '$aSed Test' a
$ cat a
A@
b@
c@
d@
Sed Test
$ cat a.bak
a:
b:
c:
d:
更多内容: sed详解 - 知乎