sed用法(一)
sed 可以实现 grep 的大部分功能,而且还可以查找替换。唯一缺陷是不能有颜色区分显示。
-n 只打印符合规则的行
打印指定行 p表示print
知识点一:
#sed '10'p -n 1.txt 打印第10行
#sed '1,4'p -n 1.txt 打印1-4行
#sed '5,$'p -n 1.txt 打印5到末行
#sed '10'p 1.txt 不加 -n 打印所有的行,如下图所示:
#sed '/root/'p 1.txt|wc -l
#sed '/root/'p -n 1.txt|wc -l
知识点二:
打印包含某个字符串的行
#sed -n '/root/'p 1.txt
知识点三:
可以使用 ^ . * $ 等特殊符号
#sed -n '/root/'p 1.txt 【含有root的行】
#sed -n '/^roo/'p 1.txt 【以roo开头的行】
注意:^[roo]与^(roo)的区别!
#sed -n '/r.*t/'p 1.txt 贪婪匹配==cgrep -n 'r.*t' 1.txt
#sed -n '/r\?t/'p 1.txt ?需要脱意符号\ ==egrep -n 'r?t' 2.txt==grep -n 'r\?t' 2.txt
知识点四:
sed 不识别 + ? 并且符号| {} 组合符号() 等符号,需要借助脱意符号 \ 或者 使用选项 -r
#sed -n -r '/ro+/'p 1.txt == egrep -n 'ro+' 1.txt == grep -n 'ro\+' 1.txt
#sed -n '/ro\+/'p 1.txt
# sed -n '/\(oo\)\+/'p 1.txt
# sed -n -r '/(oo)/'p 1.txt
# sed -r -n '/roo|ftp/'p 1.txt
sed支持grep的所有表达式,取非,开头结尾等,需要用-r。
知识点五:
-e 同时进行多个表达式
#sed -e '/root/p' -e '/body/p' -n 1.txt
; 同时进行多个表达式
#sed '/root/p ; /body/p' -n 1.txt
一个分号即可,无需全部括起来。分号前面一定要有p,-n位置在前在后没有影响。如果一行里面,有root,又有body,那么会在屏幕上出现两次这个结果。如果是或者的命令,#sed -n -r '/root|body/'p 1.txt 只会显示一次结果,或者的命令只会运行一次。
知识点六:
不显示指定的行,并非删除文本中的行
#sed '/root/' d 1.txt 删除包含root的行
#sed '1'd 1.txt 删除第一行 '1d' 或者 '1'd
#sed '1,10'd 1.txt 删除1到10行
#sed '/[a-zA-Z]/'d 1.txt
#sed '/[0-9]/'d 1.txt
知识点七:
替换功能(重点,有时面试会问到!)
#sed '1,2s/ot/to/g' 1.txt 全局替换,全部显示
1,2表示替换第一行和第二行
s 替换的意思
g 全局替换
& 增加替换
命令里面的 / 可以用 # 或者 @ 替换
#sed '1,2s@ot@to@g' 1.txt
#sed '1,10s/nologin/login/g' 1.txt
#sed -n '1,10s/nologin/login/g'p 1.txt 只显示1-10行修改的行
# sed -n '1,10s/nologin/login/gp' 1.txt 只显示1-10行修改的行
# sed -n '1,$s/nologin/login/g'p 1.txt 修改第一行到最后一行并打印
# sed -n '1,10s/\/sbin\/nologin/login/g'p 1.txt ==
#sed -n '1,10s@/sbin/nologin@login@g'p 1.txt 只替换1-10行 /sbin/nologin 里面的nologin为 login,替换后,1-10行的/sbin/nologin替换为 /sbin/login
#sed -n 's@^.*$@login@g'p 1.txt 修改所有的行为 login
#sed -n 's@^.*$@&login@g'p 1.txt 在所有的行后面增加 login
知识点八:
删除所有数字
#sed 's/[0-9]//g' 1.txt
其实就是把所有数字替换为空格
删除所有非数字
#sed 's/[^0-9]//g' 1.txt
删除所有特殊符号
#sed -n 's/[^0-9a-zA-Z]//g'p 1.txt
知识点九:
调换两个字符串位置(重点,面试会问到)
#head -n2 1.txt |sed -r 's/(root)(.*)(bash)/\3\2\1/'==head -n2 1.txt |sed -r 's/(root)(.*)(bash)/\3\2\1/g'
在sed中可以用()表示一个整体,本例中把 root 和 bash的位置调换,后面的\1\2\3 分别表示第一个小括号里面的内容,第二个小括号里面以及第三个小括号里面的内容。
# head -n2 1.txt |sed -r 's#(^[a-z0-9]+)(:.*)(:.*)#\3\2\1#g'
前两行的第一段,第三段调换位置。
知识点十:
-i 直接修改文件内容 【不建议使用】
#sed -i '1,19'd 1.txt 直接删除文本里面的1-19行
#sed -i 's/ot/to/g' 1.txt
其实使用的是 s 的替换功能
本文转自品鉴初心51CTO博客,原文链接:http://blog.51cto.com/wutengfei/1908448,如需转载请自行联系原作者