sed是一种流编辑器,它是文本处理中非常中的工具,可以逐行处理文本,能够完美的配合正则表达式使用。在日常需要做文本格式化处理时,会经常用到它,比如匹配行输出/匹配行删除/匹配行内字符串替换等。最近拿到一个静态html页面,需要对其中关键信息做格式化输出,便想起了这个东西,当然了,主要还是看对正则的熟悉程度。
读了一些sed等文档,发现其实主要也是如何在sed中使用正则表达式的各种技巧,不过Mac上坑不少,大伙还是尽量在Linux上跑。
测试文件1.txt:1
2
3
4
5
6
7
8
9<div class="list">
<a class="item">
<div class="inner">
<img class="lazy fit" data-original="news/n-20170322/n-20170322.jpg" src="imgs/default.jpg">
<h2 class="title">Featured on Dazed</h2>
<h3 class="date">Mar 22, 2017</h3>
</div>
</a>
</div>
实验一:匹配class 为lazy/title/date的行1
sed -n '/^.*\(lazy\|title\|date\)/p' 1.txt >2.txt
这里注意
- -n表示不打印源文件,只答应匹配的行,
2.正则中表示或的’|’需要用反斜杠转义
3.正则尾部p表示打印
4.mac系统上的sed无法做这种或字符串匹配,查资料说只对GUN sed 有效
输出结果2.txt:1
2
3<img class="lazy fit" data-original="news/n-20170322/n-20170322.jpg" src="imgs/default.jpg">
<h2 class="title">Featured on Dazed</h2>
<h3 class="date">Mar 22, 2017</h3>
实验二: 对2.txt做处理 ,保留data-original属性值和h2,h3内容1
sed 's/^.*data-original="\(\[^"\]\+\)".*/\1/"
其他重要应用:
1.使用 & 标记已匹配字符1
echo this is a test line | sed 's/\w\+/[&]/g'
输出结果:[this] [is] [a] [test] [line]
说明:/\w+/表示匹配一个单词,正则开始对s表示匹配字符串替换, 这里表示将匹配到的单词str替换为[str],单词外包裹一个括号,g表示行内满足条件全部匹配。
tips: GUN sed下测试,Mac下测试无效
2.匹配子串标记1
echo eric ERIC 123 | sed 's/\([a-z]\+\) \([A-Z]\+\)\(.*\)/\2|\1/'
输出结果:ERIC|eric
说明: \1 ,\2分别表示用()包裹起来的1,2两个匹配子串
tips: GUN sed下测试,Mac下测试无效
更多详细用法,请参考这里
还有这里,酷壳的sed简明教程