“ 我才不要手动改配置。——编程三分钟”
概述
sed命令是用来批量修改文本内容的,比如批量替换配置中的某个ip。
sed [参数] [文本或文件]
由于不加-i
参数只会输出到控制台不会写入到文件中,所以以下例子默认加-i
插入
在某行前面插入一行
$ sed -i "1a insert after" file.txt $ cat file.txt 1 insert after 2 3
其中1a
表示在第1行后(after)插入
在某行后面插入一行
$ sed -i "1i insert before" file.txt $ cat file.txt insert before 1 2 3
其中1i
表示在第1行前插入
删除
$ sed -i '2,3d' file.txt $ cat file.txt 1
删除行可以删除一行 (3d
删除第三行),也可以写一个范围(2,3d
删除2-3行,闭区间),$
符号代表末尾/^2/d
代表删除所有内容以2开头的行)
替换行
$ sed -i '2c replace' file.txt $ cat file.txt 1 replace 3
2c replace
表示替换第2行的内容为replace
/^2/c replace
代表替换所有以2开头的行为replace
)
仅替换匹配的字符串
为了便于演示修改文件内容为
$ cat -n config.txt 1 name=coding3min 2 age=0 3 email=coding3min@foxmail.com 4 name=coding3min 5 age=0 6 email=coding3min@foxmail.com
使用命令批量替换3-4
行之间coding3min
字符串为tom
$ sed -i '3,4s/coding3min/tom/g' config.txt $ config.txt name=coding3min age=0 email=tom@foxmail.com name=tom age=0 email=coding3min@foxmail.com
s/coding3min/top/g
代表全文匹配不限制行,去掉g
代表只替换匹配到的第一个如s/coding3min/top
查找与输出
输出3-4行的内容
sed -n 3,4p config.txt email=coding3min@foxmail.com name=coding3min
查找所有以name开头的行
sed -n '/^name/p' config.txt name=coding3min name=coding3min
可以看到只要用-n
参数+匹配p模式就可以sj查找并输出
自动创建备份文件
当然了,直接sed -i
很容易造成替换错误,哭都没办法哭!所以需要事先用-n+p
也就是上一节说的方法先校验下结果。但是每个都校验显然是不实际的。所以可以用 sed -i备份文件后缀的方式
例如sed -i.bak
或者sed -i.backup
$ sed -i.bak 's/coding3min/kitty/g' config.txt $ ls config.txt config.txt.bak $ cat config.txt name=kitty age=0 email=kitty@foxmail.com $ cat config.txt.bak name=coding3min age=0 email=coding3min@foxmail.com
与grep的结合使用
与grep
结合使用最爽的点就在可以提前校验和批量替换,提高容错率和效率,不会的赶紧Get了
sed -i 's/coding/kitty/g' `grep -rl coding *` $cat config.txt name=conding3min age=0 email=conding3min@foxmail.com $cat test/config.txt name=conding3min age=0 email=conding3min@foxmail.com
看明白了吗?上一节说的grep -rl
递归找到匹配的文件,并把文件名输出,前后加上了 ` 反引号,就是键盘左上角数字1左边那个符号,代码提前执行。
其他技巧
使用sed把DOS格式的文件转换为Unix格式 sed 's/.$//' filename
匹配所有包含邮箱的行,(-n
选项让sed仅仅是输出经过处理之后的那些行)
sed -n '/[A-Za-z0-9]\+\@[a-zA-Z0-9_-]\+\(\.[a-zA-Z0-9_-]\+\)/p' config.txt email=coding3min@foxmail.com email=coding3min@foxmail.com
去掉所有的html标签
$ cat html.txt <b>hi!</b><span>I'm</span> $ sed 's/<[^>]*>//g' html.txt hi!I'm father