前言
sed是一个流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。虽然在某些方面类似于允许脚本编辑的编辑器,但sed的工作方式是只对输入进行一次传递,因此效率更高。但是sed在管道中过滤文本的能力是它与其他类型编辑器的特别之处。
目录
2.1. *********** 增 ***********
2.2. *********** 删 ***********
2.3. *********** 改 ***********
2.4. *********** 查 ***********
1. 语法
sed [选项] {自编脚本} [文件]
1.1. 参数解释
-n:取消自动打印模式空间(常用)
-i:编辑文件(常用)
-r:在脚本中使用扩展正则表达式(常用)
-f:添加“脚本文件”到程序的运行列表
-s:处理多个文件时,将输入文件视为各个独立的文件而不是一个长的连续输入
1.2. 动作解释
s:替换某个字符串
c:替换某行
d:删除某行
p:打印某行
a:在指定行的下一行添加字符串
i:在指定行的上一行添加字符串
I:忽略大小写
2. 常见用法
2.1. *********** 增 ***********
2.1.1. 指定添加到下一行
sed "2a 'ss' oo" file.txt # 2a表示在第2行后面添加指定字符串,仅输出,不修改文件
sed -i "2a 'ss' oo" file.txt # 加入 -i 直接修改文件
2.2.2. 指定添加到上一行
sed '2i oo' file.txt # 2i表示在第2行前面添加指定字符串,仅输出,不修改文件
sed -i '2i oo' file.txt # 加入 -i 直接修改文件
2.2.3. 指定添加到行首
sed '2s/^/oo/' file.txt # /表示分隔符,2s表示修改第2行,^表示行首,oo表示需要添加的字符串。不修改文件
sed -i '2s/^/oo/' file.txt # 加入 -i 直接修改文件
sed -i '/^rm/s/^/#/' file.txt #注释以rm开头的行
sed -i '3s/^/#/' file.txt #注释第3行
sed -i '3,6s/^/#/' file.txt #注释第3-6行
2.2.4. 指定添加到行尾
sed '2s/$/oo/' file.txt # /表示分隔符,2s表示修改第2行,$表示行首,oo表示需要添加的字符串。不修改文件
sed -i '2s/$/oo/' file.txt # 加入 -i 直接修改文件
sed -i '1,5s/$/;/' file.txt #1-5行 行尾添加符号 ;
2.2.5. 增加多行
sed -r '2a 增加的第一行\n增加的第二行' file.txt # \n表示换行
除了指定某行,还可以使用模糊匹配、正则匹配
sed '/ [模糊匹配内容] /a/ [需要修改的内容] / [修改后的内容] /' filename
sed -r '/ [正则匹配内容] /a/ [需要修改的内容] / [修改后的内容] /' filename
2.2. *********** 删 ***********
2.2.1. 删除指定行数
sed -i '2d' file.txt # 删除第2行
sed -i '2,8d' file.txt # 删除 2-8 行
sed -i '$d' file.txt # 删除最后1行
2.2.2. 删除以什么开头的行
sed -i '/^a/d' file.txt # 删除以a开头的行
2.2.3. 删除以什么结尾的行
sed -i '/7$/d' file.txt # 删除以7结尾的行(7可以为任意字符串)
2.2.4. 删除包含某个字符串的行
sed -i '/a/d' file.txt # 删除包含a的行
2.2.5. 删除注释的行
sed -i '/^#/d' file.txt # 删除以#开头的行
2.2.6. 批量取消注释
sed -i 's/^#//' file.txt # s表示替换,使用正则匹配以#开头,替换为空。不修改文件
2.3. *********** 改 ***********
2.3.1. 指定行数修改字符串
sed '1s/a/b/g' file.txt # 1s表示修改第一行,a表示需要修改的内容,b表示修改后的内容,g表示1行内全部a都修改为b。不修改文件
sed -i '1s/a/b/g' file.txt # 加入 -i 直接修改文件
sed '1,3s/a/b/g' file.txt # 修改 1-3 行(将a替换为b)
2.3.2. 修改包含某个字符串的行
sed '/a/s/a/oo/g' file.txt # 将带有a的行,把a修改为oo。不修改文件
sed -i '/a/s/a/oo/g' file.txt # 加入 -i 直接修改文件
除了指定某行,还可以使用正则匹配
sed -r '/ [正则匹配内容] /s/ [需要修改的内容] / [修改后的内容] /' filename
2.4. *********** 查 ***********
2.4.1. 查询指定行
sed -n '1p' file.txt # -n抑制内存输出
查询 1-3 行
sed -n '1,3p' file.txt
分片查询,输出行1,4,7...
sed -n '1~3p' file.txt # 1表示起始行,3表示间隔3行
分片查询,输出行2,4,6,8...
sed -n '2~2p' file.txt
2.4.2. 查询最后一行
seq 1 10 |sed -n '$p' # $表示结尾
不输出最后一行(!取反)
seq 1 10 |sed -n '$!p'
输出倒数第2行
sed -n '${x;p};h'
2.4.3. 查询匹配的后一行
seq 1 10 |sed -n '/5/ {n;p}' # n表示读取下一行
输出匹配行 + 下一行
seq 1 10 |sed -n '/5/, +1p'
2.4.4. 查询匹配的上一行
seq 1 10 |sed -n '/4/ {x;p}; h'
2.4.5. 查询总行数
seq 1 10 |sed -n "$="
2.4.6. 查询包含某个字符串的行
sed -n '/a/p' file.txt # 匹配带有a的行,p表示打印
2.4.7. 查询包含某2个字符串的范围
seq 1 10 |sed -n '/^2/, /^5/p' # 匹配以2开头和以5开头的行,取中间范围
2.4.8. 连续匹配
seq 1 10 |sed -n '/3/p; '/6/p'' # 使用分号分割
2.4.9. 忽略大小写
echo "AabcDe" |sed -n 's/a/0/Igp'
I:忽略大小写
g:表示全部
p:打印
2.4.10. 正则表达式
字符 | 解释 | 用法 |
^ | 匹配以什么开始 | sed -n '/^ab/p' 匹配以ab开头的行 |
$ | 匹配以什么结尾 | sed -n '/ab$/p' 匹配以ab结尾的行 |
. | 匹配任意一个字符 | sed -n '/a.c/p' 只匹配a与c之间拥有一个字符的行 |
.+ | 匹配1次或多次 | sed -n '/a.+c/p' 匹配a与c之间任意字符的行,不包含ac |
* | 匹配0次或多次 | sed -n '/a*c/p' 匹配a与c之间任意字符的行,包含ac |
| | 相当于 or | sed -n '/ab|ac/p' 匹配包含ab或ac的行 |
[] | 匹配括号中任意一个字符 | sed -n '/[ac]/p' 匹配包含a或c的行 |
[^] | 匹配非括号中任意一个字符 | sed -n '/[^ac]/p' 匹配不包含a或c的行 |
- | [0-9] 匹配数字 | sed -n '/[0-9]/p' 匹配包含数字的行 |
[^0-9] 匹配非数字 | sed -n '/[^0-9]/p' 匹配不包含数字的行 | |
[a-z] 匹配小写字符串 | sed -n '/[a-z]/p' 匹配包含小写字符串的行 | |
[^a-z] 匹配非小写字符串 | sed -n '/[^a-z]/p' 匹配不包含小写字符串的行 | |
[A-Z] 匹配大写字符串 | sed -n '/[A-Z]/p' 匹配包含大写字符串的行 | |
[^A-Z] 匹配非大写字符串 | sed -n '/[^A-Z]/p' 匹配不包含大写字符串的行 | |
() | (a|b) 匹配括号中任意字符 | sed -n '/0(a|b)1/p' 只匹配0a1和0b1的行 |
(a)+ 匹配包含1个或多个a | sed -n '/0(a)+1/p' 匹配0和1之前1个或多个a,0a1、0aa1... | |
{} | {n} 指定匹配n个以上 | sed -n '/ab{2}/p' 匹配包含ab,且a或b连续为2次以上:abb |
{n,m} 指定匹配 n-m 个 | sed -n '/ab{2,3}/p' 匹配包含ab,且a或b连续为2-3次:abb、aaab |
示例(适用于所有增、删、改、查):
# -n 表示抑制内存输出,-r 表示正则匹配
sed -n -r '/^a/p' file.txt # 匹配以 a 开头的行
sed -n -r '/b$/p' file.txt # 匹配以 b 结尾的行
2.4.11. 修改匹配符
sed '/b/s#b#o#' file.txt
需要注意的是:模糊匹配处只能使用 /