声明: 以下所有的操作, 博主本人均在阿里云(ubuntu 18.04)上验证过, 可能不同的系统有些许差异, 还望大家学以致用。
本人能力有限,资历尚浅,若有错误,请轻点拍砖,若有建议, 不胜感激!!!
目录
工作原理
sed读取一行,首先将这行放入到缓存中然后,才对这行进行处理处理完成以后,将缓冲区的内容发送到终端存储sed读取到的内容的缓存区空间称之为:模式空间
参数说明
-e | 以选项中指定的script来处理输入的文本文件, 一个语句中可以指定多个脚本。exp: sed -n -e '3p' -e '7p' a.txt |
-f | 以选项中指定的script文件来处理输入的文本文件 |
-h | 显示帮助 |
-n | quiet(静默)把处理之后的结果输出, 方便check |
-V | 显示版本信息 |
动作说明
追加
-
基础
a :追加, a 的后面可以接字串(string1),string1 会成为匹配行的下一行内容
exp:
sed '4a llll' a.txt | 在第四行之后追加一行, 内容为llll |
sed '/b/a llll' a.txt(sed '/pattern/allll' a.txt) | 根据pattern匹配, 在匹配行之后追加一行, 内容为llll |
-
提高
在匹配行之后的某一行插入一行内容:
sed '/aaa/{n;n;s/$/\nWORD/g}' a
替换
-
基础
sed '2,5c kkkkk' a | 把2行和5行之间的所有内容 |
sed '/bbb/c kkkkk' a | 把匹配bbb的行都替换为kkkkk |
注意:一定要区分s的替换, c的替换是整行的,而s是对字符串的替换
删除
-
基础
d :整行删除,因为是删除,所以 d 后面通常不接任何咚咚.
基本格式是: sed '地址命令‘ a.txt
地址的指定方式如下:
- #,#
- /pattern1/,/pattern2/
- /pattern1/,+n
sed '5,9d ' a.txt | 删除第3到第9行 |
sed '/aaa/,/bbb/d ' a.txt | 删除匹配"aaa"的行到匹配"bbb"的行之间的行 |
sed '/aaa/,+10d ' a.txt | 删除包含"aaa"的行以及之后的10行(共计11行) |
-
PS:
- $ 表示结尾, 也可以用来指定地址;
- 由于 sed '地址命令‘ a.txt, sed的执行脚本有两部分组成, 如果你不指定地址, 根据sed行编辑的特性, 读一行删除一行, 整个文件都没了;
-
提高
sed '/pattern/{n;d}' a.txt | 删除匹配到行的下一行内容 |
sed -n '$!N;/\n.*aaa/!P;D' | 删除匹配行的上一行内容 |
sed '/pattern/{p;:a;N;$!ba;d}' a.txt | 删除匹配的下一行到最后一行 |
sed '5~2d' a.txt | 从第5行开始, 隔行删除 |
sed '/aaa11/d;:go;1,X!{P;N;D};N;bgo' a | 删除匹配行以及之前X行 |
插入
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
PS:要注意i 和a 的差别, i是在指定(或者匹配)地址的位置插入, 把匹配到的行挤到下一行了, 但是a实在匹配到的行的下一行追加
sed '1,4ihahaha ' a.txt | 在文件第一行和第四行的每行下面新增一行, 内容为hahaha |
打印
p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行
基础
sed -n '3p ' a.txt | 打印第三行的内容 |
sed -n '1,3p ' a.txt | 打印第一行到第三行的内容 |
sed -n '/patern/p' a.txt | 打印匹配到patern 的所有行的内容 |
sed -n '/patern/=' a.txt | 打印匹配到patern 的所有行的行号 |
sed -n '/patern1/,/patern2/p ' a.txt | 打印patern1和patern2之间的所有行内容(包含这两行) |
提高
sed -n '3p;7p' a.txt | 打印第三行和第七行, 等同于 sed -n -e '3p' -e '7p' a.txt |
sed -n -e '/pattern/{n;p}' a.txt | 打印匹配行的下一行 |
sed -n '/pattern/{x;p};h' a | 打印匹配行的上一行 |
sed -n -e '/pattern/{8,16p}' a | 把文本8到16行的内容中匹配到的行打出来 |
替换
-
基础
s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!
可以先定位到行再替换:
-
提高
1 .保留精确匹配到的部分, 替换其他部分:
sed 's/\(kernel\.core_pattern=\).*/\1core/g' a.txt
sed 's/\(匹配项\)需要被替换项/\1core/g' a.txt ;\1 代表了括号匹配的内容
我们可以多次精准匹配, 并保留匹配到的结果
2. &符号的使用
sed 's/111e/hello_&/g' a.txt | & 符号在sed命令中代表上次匹配的结果 |
ps: 上面1的操作也可以用此方法实现, 但是&符号只有一个, 上面的却可以有多个匹配保留项目
3. 需要匹配两行或者多行的情况
sed '/aaa/{n;s/bbb/WORD&/g}' a
ps: 注意{里面的n; 这个是下一行的意思, 如果是需要匹配到第一个,然后匹配他的第三行, 再加一个n;
sed '/aaa/{n;n;s/bbb/WORD&/g}' a
注意:以上两种多行匹配, 替换的也只是最后一次匹配行的行内内容, 如上例,只能替换掉第三行,如果想替换两次匹配之间的内容呢???
sed '/aaa/{N;N;s/111/WORD/g}' a
读入
sed '/ccc/r b' a | 把文件b的内容追加到根据ccc匹配到的行后面 |
写入
sed -n '/ccc/,/ddd/w b' a | 把ccc行和ddd行之间的所有内容, 输入到文件b中 |