Linux三剑客老二sed

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

概述

sed命令是用来批量修改文本内容的,好比批量替换配置中的某个ip。
sed命令在处理时,会先读取一行,把当前处理的行存储在临时缓冲区中,处理完缓冲区中的内容后,打印到屏幕上。而后再读入下一行,执行下一个循环。不断的重复,直到文件末尾。
语法:linux

sed [参数] [文本或文件]
复制代码

因为不加-i参数只会输出到控制台不会写入到文件中,因此如下例子默认加-i编程

插入

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

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

  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开头的行为replaceui

仅替换匹配的字符串

为了便于演示修改文件内容为spa

$ 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字符串为tom3d

$ 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/topcode

查找与输出

输出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复制代码

推荐阅读

(点击标题可跳转阅读)

linux三剑客之老三grep

个人服务器怎么老这么慢,难道说是被挖矿了?linux开机启动项自查

我偷偷挖了一条网络隧道,差点被公司激活

若是有帮助别忘了分享给朋友哦~

相关文章
相关标签/搜索