我才不要手动改配置。——编程三分钟


概述

sed命令是用来批量修改文本内容的,比如批量替换配置中的某个ip。

sed [参数] [文本或文件]

由于不加​​-i​​​参数只会输出到控制台不会写入到文件中,所以以下例子默认加​​-i​

插入

  1. 在某行前面插入一行
$ sed -i "1a insert after" file.txt
$ cat file.txt
1
insert after
2
3

其中​​1a​​表示在第1行后(after)插入

  1. 在某行后面插入一行
$ 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




如果有帮助别忘了分享给朋友哦~