Shell文本处理三剑客之sed的使用
sed是streameditor的缩写,流编辑器,主要用于对标准输出或文件进行处理。
语法:
stdout|sed[option]"patterncommand" sed[option]"patterncommand"file1
常用选项(option)
#-n只打印静默模式匹配行,而不输出原行 #p是打印命令 ➜sed'/hello/p'helloWorld.sh #!/bin/bash HELLObash echo"helloworld" echo"helloworld" ➜sed-n'/hello/p'helloWorld.sh echo"helloworld" #-e追加一组编辑命令 ➜sed-n-e'/hello/p'-e'/HELLO/p'helloWorld.sh HELLObash echo"helloworld" #-f把所有编辑命令保存在文件中,适用于复杂编辑操作 ➜catedit.sed /hello/p ➜sed-n-fedit.sedhello.md #-E(或-r)支持扩展正则表达式 ➜sed-n-E'/hello|HELLO/p'helloWorld.sh HELLObash echo"helloworld" #-i直接修改源文件内容 #s是替换命令 #这里是吧helloWorld.sh文件中所有的hello改为hello123 sed-n-i's/hello/hello123/g'helloWorld.sh
匹配模式(pattern)
匹配模式 | 说明 |
---|---|
10command | 第10行 |
10,20command | 第10到20行 |
10,+5command | 第10到16行 |
/pattern1/command | 匹配pattern1对应的行 |
/pattern1/,/pattern2/command | 从pattern1对应的行开始,到pattern2的行 |
10,/pattern1/command | 从第10行开始,到pattern1的行 |
/pattern1/,10command | 从pattern1对应的行开始,到第10行 |
常用编辑命令(command)
查询
- p打印匹配的内容
增加
- astring行后追加
- istring行前追加
- rfile从外部文件读入,在匹配的行后追加
- wnewfile将匹配的行写入外部文件
删除
- d删除
修改
- s/old/new替换行内第一个old为new
- s/old/new/g行内所有old替换为new
- s/old/new/2g从第2行开始到文件末尾的所有old替换为new
- s/old/new/ig行内所有old替换为new,忽略大小写
示例:
#删除以sys开头、并且以/sbin/nologin结尾的行 ➜sed-i'/^sys.*\/sbin\/nologin$/d'passwd_bak #删除注释行、空行 sed-i'/[:blank:]*#/d;/^$/d'passwd_bak #查找在以vagrant开头的行,下一行追加内容 ➜sed-i'/^vagrant/a这是追加的一行内容'passwd_bak #把所有的root替换为root123 ➜sed-i's/root/root123/ig'passwd_bak #在所有以sys开头、以nologin结尾的行,尾部追加_666 #其中&表示前面正则匹配到的内容 ➜sed-i's/^sys.*nologin$/&_666/g'passwd_bak #把所有以sys开头、以nologin_666结尾的行改为 #以SYS_开头、以_777结尾,其中\1表示前面括号中匹配的中间部分内容 ➜sed-i's/^sys\(.*\)nologin_666$/SYS_\1_777/g'passwd_bak #把1~10行所有的sys改为SYS ➜sed-i'1,10s/sys/SYS/ig'passwd_bak #统计my.cnf文件中mysqld的子配置项数量 #sed查找从[mysqld]到下一个[.*]之间的行 #grep-v过滤注释、空行和[.*]行 #wc-l统计最后的行数 sed-n"/^\[mysqld\]$/,/^\[.*\]$/p"/etc/my.cnf|grep-Ev'^$|[#;]|^\[.*'|wc-l
注意:如果匹配模式中存在变量,则建议使用双引号,如sed-i"s/$OLD_STR/$NEW_STR/g"passwd_bak
到此这篇关于Shell文本处理三剑客之sed的使用的文章就介绍到这了,更多相关Shell文本处理sed内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!