sed是linux下一个非常好用的流式编辑器(stream editor), 它通过一边传输一边过滤的方式来对文本进行编辑,我们可以对指定内容进行排除/选择/替换/删除/增加等操作,同时可以配合正则表达式来使用.sed是以行为单位进行处理的,可以利用管道设置进行多个sed串接处理.这样,只要从管道的一头输入原始文本,从另一头就可以输出得到我们所需要的数据和格式了.sed只是对输出流进行了处理,原始的文件可以保持不变.
总结一下常用的sed命令, 以方便复习.
1. sed对文本行的过滤和处理
sed -n '5p' test.txt 输出第5行 (-n 仅显示处理后的结果 -p 打印(输出)处理后的行)
sed -n '1,10p' test.txt 输出1-10行
sed '2,3d' test.txt 删除2-3行
sed '/12345/p' test.txt 仅输出包含了12345的行
sed '/^abc/p' test.txt 仅输出以abc开头的行
sed '/abc$/p' test.txt 仅输出以abc结尾的行
2. sed命令替换功能, 一般格式: '(y或s)/ab/AB/(g)' y-单个字符替换; s-字符串替换; g-全局替换.
'y/abc/ABC/': 将一个字符替换为另外一个字符, 即将行中的第一个a替换成A, 第一个b替换成B, ...
'y/abc/ABC/g': 将所有的a替换成A, 所有的b替换成B, ...
's/abc/ABC/': 将一个字符串替换成另外一个字串, 即将行中的第一个abc替换成ABC.
's/abc/ABC/g': 将所有的abc替换成ABC.
3. sed命令提取字符串的功能, 一般格式: 's/\(..\)/\1/' --提取行中第1个符合..所指定条件的字符串
sed -n 's/.*\(http:.*jpg\).*/\1/p' test.txt 提取行中包含http:....jpg部分的内容,并输出. (显示有误,查看源码)
4. sed多个表达式一起执行, 可以用'-e'或者';'分隔开.
sed -e 's/12345/abcde/g' -e '1,3d' test.txt 先将所有12345替换成abcde,再删去1-3行
sed 's/12345/abcde/g; 1,3d' test.txt (同上)
5.综合应用
有了以上铺垫,我们可以很容易从文本中过滤出我们需要的内容了:
比如:
curl https://bing.ioliu.cn?p=100 | sed 's/h3/\n/g; s/src="/\n/g; s/?imageslim"/\n/g' | sed -n 's/^>\(.*\)<\/$/\1/p'
....
伊吹山车道上的秋景,日本滋贺县米原市 (© The Asahi Shimbun/Getty Images)
奔跑中的柯尼克马,荷兰东法尔德斯普拉森自然保护区 (© Jim Brandenburg/Minden Pictures)
普卡基湖,新西兰南岛 (© Martin Heck/Nimia)
吐鲁番盆地鸟瞰图,中国 (© NASA)
美洲杉国家公园内的悬崖湖,美国加利福尼亚州 (© Caleb Weston/Getty Images)
慕尼黑啤酒节期间的摩天轮以及埃尔福特大教堂和圣西弗勒斯教堂的景象 (© Hans P. Szyszka/age fotostock)
【今日秋分】清晨以风筝为伴晨跑中的人,中国上海 (© Kiszon Pascal/Getty Images)
多利草地荒野内熊岩保护区的秋景,美国西弗吉尼亚州 (© Anthony Heflin/500px)
普罗奇达岛,意大利那不勒斯湾 (© Frank Chmura/age fotostock)
罗滕伯格园内的葡萄园,德国巴登-符腾堡州 (© Werner Dieterich/plainpicture)
柯库布里的雀鹰,苏格兰 (© Ray Cooper/Solent News/REX/Shutterstock)
瓜伊哈纳斯国家公园保留地和海达文物古迹内的一条森林溪流,加拿大不列颠哥伦比亚省 (© Robert Postma/plainpicture)