9.4/9.5 sed
egrep 查找符合条件的行
sed 查找指定第几行-第几行
sed 可以实现 grep 的大部分功能,而且还可以查找替换。唯一缺陷是不能有颜色区分显示。
重点在 -i的直接替换选项。
-n 只打印符合规则的行,一定和p一起使用。
打印指定行 p表示print,想起来sed,就记住np【翔翔】
#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 -n '/root/'p 1.txt
可以使用 ^ . * $ 等特殊符号
#sed -n '/root/'p 1.txt
#sed -n '/^roo/'p 1.txt
#sed -n '/r.*t/'p 1.txt 贪婪匹配
#sed -n '/r?t/'p 1.txt ?需要脱意符号
sed 不识别 + ? 并且符号| {} 组合符号() 等符号,需要借助脱意符号 \ 或者使用选项 -r
#sed -n -r '/ro+/'p 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。
匹配包含root或者 body 的行
-e 同时进行多个表达式
#sed -e '/root/p' -e '/body/p' -n 1.txt -n在filename前面,或者在sed后面,其他位置不行。
#egrep -n 'root|body' 1.txt
; 同时进行多个表达式
#sed '/root/p ; /body/p' -n 1.txt
一个分号即可,无需全部括起来。分号前面一定要有p,-n位置在前在后没有影响。如果一行里面,有root,又有body,那么会在屏幕上出现两次这个结果。
| 或者表达式
#sed -n -r '/root|body/'p 1.txt
如果是或者的命令,和上面用分号 ; 进行表达的结果比较,即便有一行既包含root,又包含body, 那么该命令也只会显示一次结果,或者的命令只会运行一次。
不显示指定的行,并非删除文本中的行
#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 全局替换,全部显示
s 替换的意思
g 全局替换
& 增加替换
命令里面的 / 可以用 # 或者 @ 替换
#sed -n '1,2s/ot/ot/g'p 1.txt 全局替换,只显示符合规则的行 -n 一定和 p一起使用
#sed '1,10s/nologin/login/g' 1.txt 1-10行的nologin替换成login,全局打印
#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//sbin/login/g'p 1.txt ==
#sed -n '1,10s@/sbin/nologin@/sbin/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 -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
调换两个字符串位置,调换前两行root和bash的位置
#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 分别表示第一个小括号里面的内容,第二个小括号里面以及第三个小括号里面的内容。
第一段的username和后一段的 shell 调换位置
#sed -r 's/([^:]+)(:.*:)([^:]+)/\3\2\1/' /etc/passwd
前两行的第一个字母和最后一个字母调换位置
head -n2 1.txt |sed -r 's/(^.)(.*)(.$)/\3\2\1/'
-i 直接修改文件内容 【不建议使用】
#sed -i '1,19'd 1.txt 直接删除文本里面的1-19行
#sed -i 's/ot/to/g' 1.txt
其实使用的是 s 的替换功能,但是在修改之前,确保没有错误。最常用
注释5-100行 ,每行的开头增加#号
sed -i 's/^/#/g' 1.txt
sed 's/^/#&/g' 1.txt