三大文本编辑
命令 | 特点 | 说明 |
---|---|---|
grep |
截取 | 查找显示 |
sed |
编辑 | 行编辑器,流操作 |
awk |
分析及处理 | 复杂分析,处理 |
grep
看正则功底。
awk
又比较全面。先看看
sed
探探底。
命令结构
- 使用结构
命令 | 选项 | 操作 | 文件 |
---|---|---|---|
sed |
option |
action |
file |
action
部分 | 组成A | 组成B |
---|---|---|
action |
address |
command |
sed
的灵魂所在,address
定位,command
操作。
sed
主体就是通过action
完成功能。
address
和command
直接相连,无任何连接符号。
- 可变部分
部分 | 变化 |
---|---|
option |
可选参数 可以为空 支持多个 |
file |
支持多个 至少一个 |
action
address
符号 | 注释 | 说明 |
---|---|---|
start,end |
start :起始行号end :结束行号 |
匹配[start,end] 行 |
/regex/ |
正则表达式 | // 声明是正则 |
/pattern1/,/pattern2/ |
中间的都是正则 | /pattern1/ 匹配的作为start /pattern2/ 匹配的作为end |
lineNumber |
指定行号 | 精确指定某行 |
$ |
最后一行 | 指定最后一行 |
start,+n |
start :起始行号+n :向后匹配n 行 |
匹配[start, start+n] 行 |
start~period |
start :匹配起始行~period :指定周期 |
匹配 |
start,~end |
同start,end |
同start,end |
d
为操作符,表示删除,先演练一下。# 删除前三行 # ----------- sed "1,3d" godme.file # ----------- sed "1d" godme.file sed "2d" godme.file sed "3d" godme.file # ---------------- sed "1,+2d" godme.file # ------------- sed "1,~3d" godme.file # 全部删除 # $记得用单引号进行转义 sed '1,$d' godme.file # ---------- sed "1~1d" godme.file # 删除奇数行 sed "1~2d" godme.file # 删除 godme 相关行信息 sed '/godme/d' godme.file
command
command |
description |
comment |
---|---|---|
d |
delete |
删除 |
p |
print |
打印输出 |
a \string |
append |
匹配行后添加新行 |
i \string |
insert |
匹配行前插入新行 |
r file |
read |
匹配行后插入文件内容 |
w file |
write |
把匹配行输出指定文件 |
s /pattern/string/[mode] |
match and replace |
查找匹配并替换 |
- 区别
ll | sed 's/root/godme/g'
s
注定是替换操作,仅通过匹配
实现定位,和具体的address
无关。在全部命令中,算是比较特殊的。
不过,也由此它也拥有二重锁定操作。
ll | sed '/judas/s/root/godme/g'
这样就可以进行二次筛选。
- 共通
# 文件覆盖 sed 'w judas' godme # 文本复制 sed 'r godme' judas # 全部删除 sed 'd' godme # ...
由此可见,
s
的独立用法并非独特。
action = address + command
:默认情况下,address
是全面范围内操作。
action = [address]command
,全部删除也不是非得麻烦一点,不是么。不过
二重筛选
,也就只有那一个了。
mode |
description |
comment |
---|---|---|
i |
ignoreCase |
忽略大小写 |
g |
global |
全局匹配 |
m |
multiline |
匹配多行 |
s |
singleline |
匹配单行 |
x |
spaces |
忽略空白 |
e |
execute |
可执行模式 |
- 分隔符
command
split
s
///
s
@@@
s
###
s
***
三个同样的特殊字符,都可以作为
s
的分隔符进行使用。在匹配内容中存在特殊字符时,我们可以替换分隔符来简化正则。
字符不固定,可以多尝试几个,
%
什么的也可以。
- 分组引用
ll | sed 's/\(r..t\)/\1er/g' # 这样分隔更清楚 ll | sed 's#\(r..t\)#\1er#g'
所有的
r..t
都会变成r..ter
。
s
中同样可以使用分组的后向引用,不过需要进行转义\(\)
。ll | sed 's/r..t/&er/g'
如果熟悉
c++
,直接把&
当做引用也没问题。虽然分组可以引用,不过那是针对整体字符串中的单个分组部分。
&
可以直接引用整个正则匹配到的内容。如果整体就是目的,
&
比分组更方便。如果正则中多个标记但是只修改其中一点,分组的方式会更加方便,看情景。
ll | sed 's/r\(oo\)t/g\1d/g' ll | sed 's/r\(oo\)t/g&d/g'
\(\)
比较繁琐,但是精准。
&
比较快捷,但是可能存在糟粕.
pattern
quote
target
/\(\)/
\n
,part
orall
//
&
all
- 一些注意
多行和单行,主要针对的是正则中存在换行符的情况。
默认匹配只匹配一次,想要能够匹配多个,请使用
g
全局。
# 打印指定行
# 双倍打印
sed '1,$p' godme.file
# 静默
sed -n '1,$p' godme.file
# 添加新行注释
sed '1,$a\#' godme.file
# 多行注释
sed '1,$a\#1\n#2' godme.file
# 前置
sed '1,$\#insert' godme.file
# 拼接小说
sed '$r /home/godme/chapter2' chapter1
# 关键信息保存
sed '/godme/w /home/godme/message' /etc/passwd
# 全本复制
sed '1,$w /home/godme/book2' book
sed '2 /home/godme/book2' book
option
command |
description |
comment |
---|---|---|
-n |
--quiet --silent |
静默模式 仅操作,不打印 |
-i |
--in-place |
把修改写入源文件 |
-e |
--expression |
拼接隔离多个指令 |
-f |
--file |
指定脚本文件 |
-r |
--regexp-extended |
使用扩展正则 |
-n
# 默认输出一遍 # 操作打印一遍 sed 'p' godme # 没有默认输出 # 只有操作打印 sed -n 'p' godme
-i
# 真的会全部删除的 # 慎用 sed -i 'd' godme
-e
# 想替换 # 也想删除 sed -e 's/root/godme/g' -e '1~2d' godme
有多个指令,两个都必须
-e
-f
# script s/root/godme/g s/judas/godme/g
ll | sed -f script
脚本文件可以定义多条,直接引用脚本文件进行处理就行了。
-r
最没用的是它,最有用的也是它。
# 扩展模式之后,括号不用再转义 ll | sed -r 's/(root)/\1er/g' # 扩展模式之后,常用的正则也能够应用了 ll | sed -r 's/o{2}/bb/g' # 要记得 通配符 基本正则 扩展正则 # 我们经常使用的是 扩展正则哦
除此之外,没其他用处了,哈哈哈。
梳理
- 多选项
sed -n -i -f script godme
- 多命令
sed -e 's/root/godme/g' -e 'p' godme
- 多文件
sed -e '/s/root/godme/g' godme judas
- 缺选项
sed '1p' godme
- 缺地址
sed -n 'p' godme
- 缺文件
ll | sed -r '1,2s/root/godme/g'
- 多多多
sed -n -i -e 's/root/godme/g' -e '1~2d' godme judas
对于
sed
和command
不可缺少,其他部分总能够省略或者找到替代的方案。