免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6032 | 回复: 28
打印 上一主题 下一主题

[文本处理] 请教高手:如何用sed在某个文件夹的所有文件中跨行匹配 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-23 17:30 |只看该作者 |倒序浏览
本帖最后由 abigale111 于 2012-07-23 18:10 编辑

   想要在包含多个子文件夹和文件的文件夹bionic下,对于文件夹下的任何一个文件,匹配显示Lesser General到Version 2之间所有的行,写入文件result,并将匹配到的文件路径也写入result,求教大牛怎么实现。

  举个例子,bionic中一个文件bionic/common/linux/mxcfb.h的内容为

/*
* The code contained herein is licensed under the GNU Lesser General
* Public License.  You may obtain a copy of the GNU Lesser General
* Public License Version 2.1 or later at the following locations:
*
* http://www.opensource.org/licenses/lgpl-license.html
* http://www.gnu.org/copyleft/lgpl.html
*/

/*

需要打印出 * The code contained herein is licensed under the GNU Lesser General
* Public License.  You may obtain a copy of the GNU Lesser General
* Public License Version 2.1 or later at the following locations:
以及该文件的绝对路径到文件result中。
没有匹配到Lesser General和Version 2之间内容的文件,不打印。
求教大牛解决方法,用sed能实现吗

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
2 [报告]
发表于 2012-07-23 18:15 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
3 [报告]
发表于 2012-07-23 18:27 |只看该作者
本帖最后由 blackold 于 2012-07-23 18:36 编辑
  1. for i in $(find bionic -type f)
  2. do    awk'/Lesser General/,/Version 2/{if(!f)print FILENAME >> "result";print >> "result";f=1}' $i
  3. done
复制代码
这应该差不多了,细节自己修改。

论坛徽章:
0
4 [报告]
发表于 2012-07-24 19:02 |只看该作者
本帖最后由 abigale111 于 2012-07-24 19:03 编辑

回复 3# blackold

    多谢大牛解答,对于一个特定的文件,下面的命令能够输出文件名和匹配的行
          awk '/Lesser General/,/Version 2/{if(!f)print FILENAME >> "result";print >> "result";f=1}' ./linux/mxcfb.h
    但是大牛给出的
          for i in $(find bionic -type f)
          do   
                 awk'/Lesser General/,/Version 2/{if(!f)print FILENAME >> "result";print >> "result";f=1}' $i
          done
     没有匹配结果,原因好像是awk识别不了$i,如果把$i改成某个具体的文件,则能够正确匹配
     请问大牛这个问题应该如何解决,多谢!

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
5 [报告]
发表于 2012-07-24 20:11 |只看该作者
回复 4# abigale111


    应该不是这个问题。
  1.     for i in $(find bionic -type f)
  2.     do   
  3.            echo $i
  4.     done
复制代码
输出什么?

论坛徽章:
0
6 [报告]
发表于 2012-07-25 09:27 |只看该作者
本帖最后由 abigale111 于 2012-07-25 09:29 编辑

回复 5# blackold


输出所有的文件路径

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
7 [报告]
发表于 2012-07-25 09:33 |只看该作者
回复 6# abigale111


    那之前的代码应该没有你所说的问题:
  1. for i in $(find bionic -type f)
  2.           do   
  3.                  awk '/Lesser General/,/Version 2/{if(!f)print FILENAME >> "result";print >> "result";f=1}' $i
  4.           done
复制代码
如果文件名或路径包含空格之类的特殊字符,还需要修改。

论坛徽章:
0
8 [报告]
发表于 2012-07-25 10:25 |只看该作者
回复 7# blackold

路径比如  android_q/bionic/linux/sp_api_smp.h
   
下划线和. 算是特殊字符吗

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
9 [报告]
发表于 2012-07-25 10:29 |只看该作者
回复 8# abigale111


    不算。

论坛徽章:
0
10 [报告]
发表于 2012-07-25 10:50 |只看该作者
回复 9# blackold

那路径和文件名就没有特殊字符了

如果用下面的特定文件,能够正确输出   
for i in $(find $srcfolder -type f)
do   
    awk '/Lesser General/,/Version 2/{if(!f)print FILENAME >> "result";print >> "result";f=1}' ./linux/if_dr.h

done

但是文件用 $i时就没有结果,是不是awk识别不了$i呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP