sed小记

本文索引:

  • 什么时候需要转义
  • 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》一书。

转载于:https://my.oschina.net/LuCastiel/blog/1578181

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值