免费注册 查看新帖 |

Chinaunix

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

[文本处理] 大神进来看看,文本处理很难 [复制链接]

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-07-11 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-07-13 22:50 |只看该作者 |倒序浏览
有一文件内容如下,写一个sed脚本能够随意取出 “xxx {};” 结构的数据块,或者删除,或则在指定的 “xxx {};”结构块后添加数据
/ {

        soc {

                apuart2: apuart2@11004000 {
                        cell-index = <2>;
                        compatible = "mediatek,mt6797-uart";
                        clocks = <&infrasys INFRA_UART2>;
                        clock-names = "uart2-main";
                };

                apuart3: apuart3@11005000 {
                        cell-index = <3>;
                        compatible = "mediatek,mt6797-uart";
                        clocks = <&infrasys INFRA_UART3>;
                        clock-names = "uart3-main";
                };
        };

};


&spi0 {
        #address-cells = <1>;
        #size-cells = <0>;

        fc1145@0 {
                compatible = "fc,fc1020";
                reg = <0>;
        };
};


&spi1 {
        #address-cells = <1>;
        #size-cells = <0>;

        fg@0 {
                compatible = "xx,fg";
        };
};






论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2016-07-13 23:38 |只看该作者
筷子喝汤
sed本不是编程语言....

评分

参与人数 2信誉积分 +16 收起 理由
ll104567 + 6 6
RE_HASH + 10 赞一个!

查看全部评分

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-07-11 06:20:00
3 [报告]
发表于 2016-07-14 00:38 |只看该作者
回复 2# jason680


    用sed, awk,等工具组合处理都可以的

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
4 [报告]
发表于 2016-07-14 10:18 |只看该作者
本帖最后由 sunzhiguolu 于 2016-07-14 10:18 编辑

匹配 &spi0 { ... } 块,
  1. perl -ne 'BEGIN{$P=0}{$P++ if(/&spi0\h+\{/ or $P>0 && /\{/);print if($P);$P-- if($P>0 and /};/)}' f
复制代码
&spi0 {
        #address-cells = <1>;
        #size-cells = <0>;

        fc1145@0 {
                compatible = "fc,fc1020";
                reg = <0>;
        };
};

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
5 [报告]
发表于 2016-07-14 10:18 |只看该作者
本帖最后由 jason680 于 2016-07-14 10:28 编辑

first, to get segment ...

$ bash get_segx.sh "fc1145@0"
        fc1145@0 {
                compatible = "fc,fc1020";
                reg = <0>;
        };

$ bash get_segx.sh "&spi0"
&spi0 {
        #address-cells = <1>;
        #size-cells = <0>;

        fc1145@0 {
                compatible = "fc,fc1020";
                reg = <0>;
        };
};

$ cat get_segx.sh
awk -v_00O0O0="$1" '{_00OOOO=NF;_000O0O="-"-"-";_00OO0O=NR;_000OOO="=="=="==";_00O00O=RS;_000O00=" ";_0000O0="*"*"*";_00000O=RT;_0000OO="\t";_00O0OO=_000OOO-_000O0O+("+"+"+");_00OOO0=_000O00""_0000OO;}{if(match($_000O0O,"["_00OOO0"]*([^"_00OOO0"]+)""["_00OOO0"]*""[{]",_00OO00)){if(_00O0O0==_00OO00[_000OOO]){_0O0000=_00O0OO;_000OO0=_00O000+_000OOO;}}}/[{] *$/{++_00O000}/[}];/{--_00O000}_0O0000{print}_00O000<_000OO0{_0O0000=_000O0O}' FILE



论坛徽章:
0
6 [报告]
发表于 2016-07-14 11:18 |只看该作者
回复 1# 308123027

问题:写一个sed脚本能够随意取出 “xxx {};” 结构的数据块,或者删除,或则在指定的 “xxx {};”结构块后添加数据:

1. 取出操作,比如取出apuart3: apuart3@11005000 {}的内容到apuart.struct:sed -n '/apuart3.*/,/.*}/p' yourfile > apuart.struct

2. 删除操作,比如删除&spi1 {}的内容:sed -i '/&spi1\ {.*/, /.*}/d' yourfile

3. 添加数据,因为我也不会,所以说下我的理解哈,sed是以“行”为操作单元的,在用sed's ‘a’ command时会在结构体的每一行后面都添加:
比如sed -i '/apuart3.*/,/.*}/a\chinaunix' yourfile命令的运行结果:
                apuart3: apuart3@11005000 {
chinaunix
                        cell-index = <3>;
chinaunix
                        compatible = "mediatek,mt6797-uart";
chinaunix
                        clocks = <&infrasys INFRA_UART3>;
chinaunix
                        clock-names = "uart3-main";
chinaunix
                };
chinaunix


你也可以用awk试试,或者说,你可以再看看sed命令的用法,确认一下,欢迎交流。

论坛徽章:
28
15-16赛季CBA联赛之八一
日期:2016-02-22 19:10:4215-16赛季CBA联赛之深圳
日期:2016-12-01 10:34:0415-16赛季CBA联赛之新疆
日期:2016-12-07 10:24:2915-16赛季CBA联赛之同曦
日期:2016-12-15 12:06:43CU十四周年纪念徽章
日期:2016-12-18 13:03:4415-16赛季CBA联赛之吉林
日期:2017-01-03 15:52:2515-16赛季CBA联赛之辽宁
日期:2017-01-04 14:58:2415-16赛季CBA联赛之辽宁
日期:2017-01-15 09:42:512016科比退役纪念章
日期:2017-02-06 17:21:50黑曼巴
日期:2017-02-10 15:46:1215-16赛季CBA联赛之上海
日期:2017-03-18 10:14:5415-16赛季CBA联赛之青岛
日期:2017-03-18 22:00:44
7 [报告]
发表于 2016-07-14 15:31 |只看该作者
  1. #查找
  2. sed -n '/&spi0/{:a;/{/{x;s/^/./;x};/}/{x;s/.//;/^$/{x;p;q};x};p;n;ba}' file

  3. #删除
  4. sed -n '/&spi0/{:a;/{/{x;s/^/./;x};/}/{x;s/.//;/^$/b;x};n;ba};p' file

  5. #添加
  6. more contents.txt
  7. o
  8. k

  9. sed -e '/&spi0/{:a;/{/{x;s/^/./;x};/}/{x;s/.//;/^$/{x;r contents.txt' -e';b};x};n;ba}' file
复制代码

论坛徽章:
36
摩羯座
日期:2013-09-23 16:37:312015年亚洲杯之沙特阿拉伯
日期:2015-04-14 09:10:172015亚冠之柏太阳神
日期:2015-06-25 08:48:212015亚冠之武里南联
日期:2015-07-28 09:01:082015亚冠之莱赫维亚
日期:2015-07-28 15:44:172015亚冠之柏斯波利斯
日期:2015-09-06 14:08:52白银圣斗士
日期:2015-11-25 17:06:2815-16赛季CBA联赛之吉林
日期:2015-12-09 16:59:072016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之辽宁
日期:2016-04-14 09:29:04luobin
日期:2016-06-17 17:46:3615-16赛季CBA联赛之天津
日期:2016-08-16 14:11:01
8 [报告]
发表于 2016-07-14 17:30 |只看该作者
  1. awk '/soc/{a=n=1;print $0;next}/\{/{n++}/\}/{n--}a==1&&n==0{print $0;exit}a*n'
复制代码

论坛徽章:
1
程序设计版块每日发帖之星
日期:2016-07-11 06:20:00
9 [报告]
发表于 2016-07-14 21:42 |只看该作者
回复 7# moperyblue


    sed大神,非你莫属!!! 留个你联系方式吧!

论坛徽章:
10
天蝎座
日期:2013-09-22 22:32:23程序设计版块每日发帖之星
日期:2016-08-07 06:20:00lufei
日期:2016-06-17 17:38:40程序设计版块每日发帖之星
日期:2016-06-12 06:20:002016科比退役纪念章
日期:2016-05-31 15:47:20CU十四周年纪念徽章
日期:2016-05-27 12:24:562015年亚洲杯之阿曼
日期:2015-05-03 21:01:352015年辞旧岁徽章
日期:2015-03-03 16:54:15天蝎座
日期:2013-10-20 21:05:24程序设计版块每日发帖之星
日期:2016-08-11 06:20:00
10 [报告]
发表于 2016-07-15 09:03 |只看该作者
308123027 发表于 2016-07-14 21:42
回复 7# moperyblue


这是要约上的节奏
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP