本文索引:
- 什么时候需要转义
- sed实现大小写转换
- sed在特定行进行内容添加
- sed打印特定范围内包含特定字符串的行
- sed高级功能:模式空间
什么时候需要转义(\或-r参数)
扩展的元字符:+ ? | () {n,m};除这些外的其他字符就不需要进行转义了!
[]的一般用法是作为范围选择,例如
[root@castiel-Lu ~]# cat test
a1234
b12345
a2341a
A123
A4521a
# []内的字符多选一,这里用于忽略大小写
[root@castiel-Lu ~]# sed -n '/^[aA].*$/p' 2.txt
a1234
a2341a
A123
A4521a
但是当[]字符实际有意义时,就需要进行转义
# 举个例子 []是内容的一部分,相当于字符
[root@castiel-Lu ~]# cat test
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfg
# 如何匹配[abcfd]行到[rty]行之间的内容
[root@castiel-Lu ~]# sed -n '/\[abcfg\]/,/\[rty\]/'p test
[abcfd]
123
324
444
[rty]
sed实现大小写转换
我们可以使用sed来实现tr命令转换大小写的效果
例如
[root@castiel-Lu ~]# cat 1.txt
aBcDeFgHiJkLmn
- 首字母转换为大写
[root@castiel-Lu ~]# sed 's/\b[a-z]/\u&/g' 1.txt
ABcDeFgHiJkLmn
- 小写字母转换为大写\u(upper)
[root@castiel-Lu ~]# sed 's/[a-z]/\u&/g' 1.txt
ABCDEFGHIJKLMN
- 大写字母转换为小写\l(lower)
[root@castiel-Lu ~]# sed 's/[A-Z]/\l&/g' 1.txt
abcdefghijklmn
sed在特定行进行内容添加
[root@castiel-Lu ~]# cat 2.txt
a1234
b12345
a2341a
A123
A4521a
- 追加特定行
# 在a开头的行后追加“_test”
[root@castiel-Lu ~]# sed -r 's/(^a.*$)/\1_test/' 2.txt
a1234_test
b12345
a2341a_test
A123
A4521a
sed打印特定范围内包含特定字符串的行
思路:先确定范围,在搜索特定字符创,最后打印即可
# 以此为例
[root@castiel-Lu ~]# cat 2.txt
a1234_test
b12345
a2341a_test
A123
A4521a
# 打印1-3行内包含字符串123的行
[root@castiel-Lu ~]# sed -n '1,3{/123/p}' 2.txt
a1234
b12345
sed高级功能:模式空间(暂时不理解)
这里涉及到了sed的模式空间概念
[root@test200 ~]# cat test
a
b
c
d
e
f
[root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c
说明:定义一个标签a
,匹配c
,然后N
把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d
,把这个模式空间里的内容全部清除。
if 匹配"c" :a 追加下一行 if 不匹配"$" goto a 最后退出循环,d命令删除。
关于sed模式空间等更多详细介绍,可以查看《sed与awk》一书。