==linux工具==
sed流式编辑器
1.工作原理
当sed由标准输入读取一行资料并放入pattern space(模式空间)时,sed按照sed script 的编辑指令逐一对pattern space内的资料执行编辑,之后再有pattern space内的结果送到标准输出,接着再将下一行资料读入。重复执行上述动作,直至读完所有资料行结束为止,另外,sed还有hold space(保持空间)可以作为暂时的文本保存区,跟pattern space进行交互。
2.实现
- 命令选项
- -n :只打印模式匹配的行
- -e :直接在命令行模式上进行sed动作编辑
- -f : 将sed的动作写入一个文件内,用 -f filename 执行filename 内sed动作
- -r :支持扩展表达式
- -i :直接修改文件内容
- 命令格式
sed [option]'sed command' filename
option正则表达式
- 脚本格式
sed [option] -f 'sed script' filename
实例
[a@localhost ~]$ cat file
aaaaaaa
bbbbbb
cccccc
ddddddd
dadasdasdcc
13510002444
123123124312
2312dasdas
21321eqwd321
2312ef2343e
21321edar3dcsdva
wdascase123wwdqwd
763608087@qq.com
www.baidu.com
[a@localhost ~]$ sed -n '/^a/p' file #只显示以a开头的行
aaaaaaa
command参数
d删除一行
[a@localhost ~]$ sed -n -r '/1[3578][0-9]{9}/p' file ##提取手机号码 13510002444 [a@localhost ~]$ sed -r '/1[3578][0-9]{9}/d' file ###表示删除一行 aaaaaaa bbbbbb cccccc dddddd dadasdasdcc 123123124312 2312dasdas 21321eqwd321 2312ef2343e 21321edar3dcsdva wdascase123wwdqwd
n读入下一行
a\加入文字(匹配行文字后输出)
[a@localhost ~]$ sed -r '/1[3578][0-9]{9}/a\telnum' file aaaaaaa bbbbbb cccccc dddddd dadasdasdcc 13510002444 telnum 123123124312 2312dasdas 21321eqwd321 2312ef2343e 21321edar3dcsdva wdascase123wwdqwd
i\插入文字(匹配行文字前输出)
[a@localhost ~]$ sed -r '/1[3578][0-9]{9}/i\telnum' file aaaaaaa bbbbbb cccccc dddddd dadasdasdcc telnum 13510002444 123123124312 2312dasdas 21321eqwd321 2312ef2343e 21321edar3dcsdva wdascase123wwdqwd
c\替换文字(将文字替换匹配文字进行输出)
[a@localhost ~]$ sed -r '/1[3578][0-9]{9}/c\telnum' file aaaaaaa bbbbbb cccccc dddddd dadasdasdcc telnum 123123124312 2312dasdas 21321eqwd321 2312ef2343e 21321edar3dcsdva wdascase123wwdqwd
s 模式替换 找到匹配行,进行匹配替换操作
[a@localhost ~]$ sed 's/a/telnum/' file telnumaaaaaa telnumdsdsaa bbbbbb cccccc dddddd dtelnumdasdasdcc 13510002444 123123124312 2312dtelnumsdas 21321eqwd321 2312ef2343e 21321edtelnumr3dcsdva wdtelnumscase123wwdqwd
g参数 在该行中,替换所有匹配而不是替换第一次匹配
[a@localhost ~]$ sed 's/a/telnum/g' file telnumtelnumtelnumtelnumtelnumtelnumtelnum telnumdsdstelnumtelnum bbbbbb cccccc dddddd dtelnumdtelnumsdtelnumsdcc 13510002444 123123124312 2312dtelnumsdtelnums 21321eqwd321 2312ef2343e 21321edtelnumr3dcsdvtelnum wdtelnumsctelnumse123wwdqwd
- n参数 在该行中,替换第n个匹配
[a@localhost ~]$ sed 's/a/telnum/2' file atelnumaaaaa adsdstelnuma bbbbbb cccccc dddddd dadtelnumsdasdcc 13510002444 123123124312 2312dasdtelnums 21321eqwd321 2312ef2343e 21321edar3dcsdvtelnum wdasctelnumse123wwdqwd
p参数 对该行执行替换,并输出该行文字
[a@localhost ~]$ sed -n 's/a/telnum/p' file telnumaaaaaa telnumdsdsaa dtelnumdasdasdcc 2312dtelnumsdas 21321edtelnumr3dcsdva wdtelnumscase123wwdqwd
w filename 参数 将替换后的该行写入filename文件中
[a@localhost ~]$ sed -n 's/a/telnum/wnew' file [a@localhost ~]$ cat new telnumaaaaaa telnumdsdsaa dtelnumdasdasdcc 2312dtelnumsdas 21321edtelnumr3dcsdva wdtelnumscase123wwd
- 多行处理
- 参数
- N 与匹配行时,再读入下一行,加在当前patern space文字的后面
- 将pattern space第一个newline字母前的文字删去,仅一个newline字母时,相当于d命令
- 存取暂存区的命令(hold space与pattern space交互)
- h pattern space 拷贝到hold space
- H pattern space 追加到hold space 后
- g hold space 拷贝到pattern space
- G hold space 追加pattern space
- x 交换两个空间的内容