bash shell - sed及awk文本捕获及替换
浏览:3518次 出处信息
看以下示例
case需求.
stream='background-image: url (a.jpg)asdfasdfasdf ;background:url(b.jpg);background'
需要将背景图片内容a.jpg及b.jpg后追加一个签名串.
sed替换不给力
如果用sed, 替换是不会有问题, 但是要在一句代码里进行捕获多个图, 将进行替换, 查阅了相关的sed文档, 貌似是需求处理不了.
代码示例
stream='background-image: url (a.jpg)asdfasdfasdf ;background:url(b.jpg);background'
echo $stream | sed 's#.*url *( *\(.*\) *).*#\1#'
#输出b.jpg
echo $stream | sed 's#.*url *( *\(.*\) *).*#\1#'
#输出b.jpg
awk代码块
用awk的话,(g)sub又没有sed里的匹配后的"后向引用"(即"\1"). 但是可以有代码块可操作.
原理可利用awk里的函数match先用正则匹配url()里的内容, 再用substr将内容取出, 随之将流的位置置后.
循环操作.
代码如下:
stream='background-image: url (a.jpg)asdfasdfasdf ;background:url(b.jpg);background'
matches=$(echo $stream | awk 'BEGIN {ORS=" "} END {
gsub(/ */,"", $0)
input=$0
while (match(input, "url([^?;)]+)")) {
print substr(input, RSTART+4, RLENGTH-4)
input=substr(input, RSTART+RLENGTH)
}
}')
for bg_file in `echo "${matches}"`; do
md5_code="test"
stream=$(echo "${stream}" | sed "s#url *( *${bg_file} *)#url(${bg_file}?v=${md5_code})#")
done
echo "${stream}"
matches=$(echo $stream | awk 'BEGIN {ORS=" "} END {
gsub(/ */,"", $0)
input=$0
while (match(input, "url([^?;)]+)")) {
print substr(input, RSTART+4, RLENGTH-4)
input=substr(input, RSTART+RLENGTH)
}
}')
for bg_file in `echo "${matches}"`; do
md5_code="test"
stream=$(echo "${stream}" | sed "s#url *( *${bg_file} *)#url(${bg_file}?v=${md5_code})#")
done
echo "${stream}"
总结
从以上的示例可以看出, awk几乎可以替代sed, 但是对于固定替换, sed使用起来更方便.
sed从使用理解上看, 与vi的命令操作很相似.
而在awk里块里几乎可以操作任意文本流.
另外要说明的是, 这两个命令所支持的正则都像是标准perl里的子集, 没有贪婪匹配与非贪婪匹配之分.
其实你应该很意外, 我为什么不用python或者php这种语言来写, 如果用字符串函数比较多的语言来写的话, 应该是非常之简单.
很遗憾也很高兴的, 这次有点钻牛角尖, 依然用了bash.
也算为学bash打下个基础.
建议继续学习:
- Linux命令行里的“瑞士军刀” (阅读:10275)
- 利用find和sed批量替换文件内容 (阅读:10053)
- AWK 简明教程 (阅读:8188)
- awk命令,实现文件的合并与拆分 (阅读:6634)
- AWK介绍 (阅读:5513)
- 更快的IP库查找方法以及AWK中的二分查找 (阅读:5318)
- awk 实例之二维数组 (阅读:5002)
- 学习Grep,Sed中的正则 (阅读:3965)
- 操作大文本,awk vs vim (阅读:3774)
- SED命令行脚本快速参考,AWK命令行脚本快速参考,perl命令行脚本快速参考 (阅读:3826)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
扫一扫订阅我的微信号:IT技术博客大学习
<< 前一篇:Shell Tips: Unix 时间到字面
后一篇:进程的一生 >>
文章信息
- 作者:Rank 来源: rank's technical notes
- 标签: awk sed
- 发布时间:2011-06-24 14:03:16
建议继续学习
近3天十大热文
- [68] Twitter/微博客的学习摘要
- [66] IOS安全–浅谈关于IOS加固的几种方法
- [64] android 开发入门
- [64] 如何拿下简短的域名
- [62] find命令的一点注意事项
- [61] Go Reflect 性能
- [60] 流程管理与用户研究
- [59] Oracle MTS模式下 进程地址与会话信
- [58] 图书馆的世界纪录
- [56] 读书笔记-壹百度:百度十年千倍的29条法则