文章目录
sed基本结构
sed 选项 [模式1][,模式2] [动作][flag] filename
模式指的是Addresses,有的朋友也会把它直译为地址。
sed的格式非常灵活,导致有时候可读性不好,不信看:
sed '1croot' sed.txt
上面这个命令简单吧,如果对sed不熟悉,晃眼可能还得愣2秒才能反应过来。
所以,我们想要一眼就可能知道sed在干什么,就一定要清楚sed结构。
我们先来看一个简单的例子,说明一下结构。
# -n是选项表示使用静默模式, '2,5p'是动作表示打印2到5行 sed.txt是要处理文件
sed -n '2,5p' sed.txt
上面这个命令也非常简单,但是它几乎包含了sed的全部结构,我们在它的基础上稍微变一下,还能一眼看穿吗?
sed '1~2p' sed.txt
sed '1,5s/aa/zzzz/g' sed.txt
sed '2s/aa/AA/2' sed.txt
sed '/aa/s/aa/AA/2' sed.txt
sed '/^luck/,+3s/luck/LUCK/g' sed.txt
sed -n '/2024-10-13 06:52:48/,/2024-10-13 06:53:21/w app.log.bak' app.log
我们只要理解结构,就会发现万变不离其中:
模式部分,我们总结一下:
模式可以包含2部分,表示匹配的区间,模式有下面几种格式:
模式格式 | 示例说明 |
---|---|
n,m | sed ‘3,5p’ sed.txt,表示只打印区间3-5行 |
n | sed ‘5p’ sed.txt,表示只打印第5行,可以看做是sed ‘5,5p’ sed.txt的简写 |
n,+m | sed ‘3,+5p’ sed.txt,表示只打印区间3-8行,可以看做是sed ‘3,8(3+5)p’ sed.txt |
/xxx/ | sed ‘/luck/’ sed.txt,表示包含luck的行 |
/xxx/,/yyy/ | sed ‘/luck/lovely/’ sed.txt,表示打印区间,从包含luck的行开始,到包含lovely的行结束 |
模式都是上面的组合,如:
- /xxx/,10
- /xxx/,+3
- 3,/xxx/
- /xxx/,/yyyy/
- 3,5
- 3,+5
- 3,$:3到最后一行
- /xxx/,~3
- 1,~3
- 1~3:这个特殊,可以看做初始值1,步长3直到sed行结尾,注意和上2个的区别(文章最后)
选项
选项 | 说明 |
---|---|
-n | slient静默模式,不输出原来的行,通常与p一起使用 |
-e | 多点编辑 |
-f | 指定sed命令脚本,-f filename则可以执行filename内的sed动作 |
-i | 直接修改读取的文件内容,而不是输出print,危险危险 |
-E | 使用扩展表达式 |
-r | 和-E等价,表示使用扩展正则表达式 |
关于扩展正则表达式,可以参考:Linux grep命令详解(多图、多示例)
-n(静默模式)
sed '2,5p' sed.txt
sed -n '2,5p' sed.txt
-e、;(多点编辑,多条命令)
# 打印2到5号,打印每行行号
sed -n -e '2,5p' -e '=' sed.txt
# 除了-e还可以使用分号(;),等价于上一个命令
sed -n '2,5p;=' sed.txt
# 打印第4行和最后一行
sed -n '4;$p' sed.txt
不知道你有没有发现,-e参数和;指定的命令模式不同,相当于都是独立的指令,如果我们要对同一个模式匹配,做多个动作,怎么办呢?
注意下面2个命令的区别:
# 这相当于是2个指令,按行读取,分别执行2个指令
sed -n '2,5p;=' sed.txt
# 这是相当于1个指令,2个动作,对于2到5行这个模式匹配,分别打印和输出行号
sed -n '2,5{p;=}' sed.txt