免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 671 | 回复: 10

[文本处理] 根据关键字修改相邻几行的定义 [复制链接]

论坛徽章:
0
发表于 2016-09-02 22:10 |显示全部楼层
a.txt文件内容如下,截取了一部分,原文很大,但是格式是固定的。

PIN VSS
  DIRECTION INOUT
  USE SIGNAL

遇到上面这种,则修改成
PIN VSS
  DIRECTION INPUT
  USE GROUND

同理遇到
PIN VDD
  DIRECTION INOUT
  USE SIGNAL
则修改成
PIN VDD
  DIRECTION INPUT
  USE POWER

就是把VSS都定义成GROUND,不管DIRECTION是什么,都改成INPUT,同理把VDD都定义成POWER,不管DIRECTION是什么,都改成INPUT。
其他都保持不变,求程序,最好是shell语言,可以直接执行,谢谢大家拉!


vi a.txt

VERSION 5.7 ;
BUSBITCHARS "[]" ;
DIVIDERCHAR "/" ;

MACRO aon211d1V5
  ORIGIN 0 0 ;
  FOREIGN aon211d1V5 0 0 ;
  SIZE 7.6 BY 14.6 ;
  PIN VSS
    DIRECTION INOUT ;
    USE SIGNAL ;
    PORT
      LAYER A1 ;
        RECT 0 0 7.6 1.8 ;
    END
  END VSS
  PIN A
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER A1 ;
        RECT 4.9 4.75 5.8 6.8 ;
    END
  END A
  PIN VDD
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER A1 ;
        POLYGON 3.35 8.45 4.4 8.45 4.4 8.35 4.55 8.35 4.55 7.45 3.45 7.45 3.45 7.55 3.35 7.55 ;
    END
  END B


论坛徽章:
130
技术图书徽章
日期: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
发表于 2016-09-02 22:30 |显示全部楼层
回复 1# minzyyl

$ cat conf.txt
VSS DIRECTION INPUT
VSS USE GROUND

VDD DIRECTION INPUT
VDD USE POWER


$ awk 'FNR==NR{if(NF==3){a[$1,$2]=$3;next}}{if($1=="PIN")NAME=$2;if(a[NAME,$1])sub($1" +[^ ;]+",$1" "a[NAME,$1])}1' conf.txt a.txt

VERSION 5.7 ;
BUSBITCHARS "[]" ;
DIVIDERCHAR "/" ;

MACRO aon211d1V5
  ORIGIN 0 0 ;
  FOREIGN aon211d1V5 0 0 ;
  SIZE 7.6 BY 14.6 ;
  PIN VSS
    DIRECTION INPUT ;
    USE GROUND ;
    PORT
      LAYER A1 ;
        RECT 0 0 7.6 1.8 ;
    END
  END VSS
  PIN A
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER A1 ;
        RECT 4.9 4.75 5.8 6.8 ;
    END
  END A
  PIN VDD
    DIRECTION INPUT ;
    USE POWER ;
    PORT
      LAYER A1 ;
        POLYGON 3.35 8.45 4.4 8.45 4.4 8.35 4.55 8.35 4.55 7.45 3.45 7.45 3.45 7.55 3.35 7.55 ;
    END
  END B


论坛徽章:
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
发表于 2016-09-03 09:57 |显示全部楼层
  1. sed -r '/PIN VSS/{n;/INPUT/!s/\w+/INPUT/2;n;/GROUND/!s/\w+/GROUND/2};/PIN VDD/{n;/INPUT/!s/\w+/INPUT/2;n;/POWER/!s/\w+/POWER/2}' a.txt
复制代码

论坛徽章:
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
发表于 2016-09-03 12:27 |显示全部楼层
  1. perl -nle 'BEGIN{$d="    DIRECTION INPUT\n";$vs="${d}    USE GROUND;";$vd="${d}    USE POWER;"}{if(/\bPIN VSS\b/){print "$_\n$vs";$j=0;next}if(/\bPIN VDD\b/){print "$_\n$vd";$j=0;next}next if($j++<=1);print}' f
复制代码

DIVIDERCHAR "/" ;

MACRO aon211d1V5
  ORIGIN 0 0 ;
  FOREIGN aon211d1V5 0 0 ;
  SIZE 7.6 BY 14.6 ;
  PIN VSS
    DIRECTION INPUT
    USE GROUND;
    PORT
      LAYER A1 ;
        RECT 0 0 7.6 1.8 ;
    END
  END VSS
  PIN A
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER A1 ;
        RECT 4.9 4.75 5.8 6.8 ;
    END
  END A
  PIN VDD
    DIRECTION INPUT
    USE POWER;
    PORT
      LAYER A1 ;
        POLYGON 3.35 8.45 4.4 8.45 4.4 8.35 4.55 8.35 4.55 7.45 3.45 7.45 3.45 7.55 3.35 7.55 ;
    END
  END B

论坛徽章:
0
发表于 2016-09-03 21:22 |显示全部楼层
回复 3# moperyblue

$ sed -r '/PIN VSS/{n;/INPUT/\w+/INPUT/2;n;/GROUND/\w+/GROUND/2};/PIN VDD/{n;/INPUT/\w+/INPUT/2;n;/POWER/\w+/POWER/2}' a.txt
sed: -e expression #1, char 20: unknown command: `\'

论坛徽章:
0
发表于 2016-09-03 21:47 |显示全部楼层
回复 4# sunzhiguolu

可以工作,谢谢!!!

论坛徽章:
0
发表于 2016-09-03 21:47 |显示全部楼层
回复 2# jason680

works,谢谢!!!

论坛徽章:
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
发表于 2016-09-03 22:09 |显示全部楼层
本帖最后由 moperyblue 于 2016-09-03 22:14 编辑

回复 5# minzyyl


是什么系统?  在centos测试没问题
  1. echo 'VERSION 5.7 ;
  2. BUSBITCHARS "[]" ;
  3. DIVIDERCHAR "/" ;

  4. MACRO aon211d1V5
  5.   ORIGIN 0 0 ;
  6.   FOREIGN aon211d1V5 0 0 ;
  7.   SIZE 7.6 BY 14.6 ;
  8.   PIN VSS
  9.     DIRECTION INOUT ;
  10.     USE SIGNAL ;
  11.     PORT
  12.       LAYER A1 ;
  13.         RECT 0 0 7.6 1.8 ;
  14.     END
  15.   END VSS
  16.   PIN A
  17.     DIRECTION INPUT ;
  18.     USE SIGNAL ;
  19.     PORT
  20.       LAYER A1 ;
  21.         RECT 4.9 4.75 5.8 6.8 ;
  22.     END
  23.   END A
  24.   PIN VDD
  25.     DIRECTION INPUT ;
  26.     USE SIGNAL ;
  27.     PORT
  28.       LAYER A1 ;
  29.         POLYGON 3.35 8.45 4.4 8.45 4.4 8.35 4.55 8.35 4.55 7.45 3.45 7.45 3.45 7.55 3.35 7.55 ;
  30.     END
  31.   END B'|sed -r '/PIN VSS/{n;/INPUT/!s/\w+/INPUT/2;n;/GROUND/!s/\w+/GROUND/2};/PIN VDD/{n;/INPUT/!s/\w+/INPUT/2;n;/POWER/!s/\w+/POWER/2}'
复制代码


sed -r '/PIN VSS/{n;/INPUT/\w+/INPUT/2;n;/GROUND/\w+/GROUND/2};/PIN VDD/{n;/INPUT/\w+/INPUT/2;n;/POWER/\w+/POWER/2}' a.txt
跟我提供的命令不一样 系统不支持!号吗?就该为以下命令:
sed -r '/PIN VSS/{n;/INPUT/!s/\w+/INPUT/2;n;/GROUND/!s/\w+/GROUND/2};/PIN VDD/{n;/INPUT/!s/\w+/INPUT/2;n;/POWER/!s/\w+/POWER/2}'


论坛徽章:
0
发表于 2016-09-04 19:30 |显示全部楼层
回复 4# sunzhiguolu

发现运行有个小问题,会把文件的头2行删除。。。

论坛徽章:
0
发表于 2016-09-04 19:33 |显示全部楼层
回复 8# moperyblue

sed -r '/PIN VSS/{n;/INPUT/!s/\w+/INPUT/2;n;/GROUND/!s/\w+/GROUND/2};/PIN VDD/{n;/INPUT/!s/\w+/INPUT/2;n;/POWER/!s/\w+/POWER/2}' a.txt

s/: Event not found.

还是有问题,我的是RHEL5.8


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

PostgreSQL中国大会,早鸟票抢购!

PostgreSQL中国大会,早鸟票抢购!
2019年11月29~11月30日,由 PostgreSQL中文社区与ITPUB联合主办的第九届《PostgreSQL 中国技术大会》将在北京隆重召开。PostgreSQL 作为功能最强的的开源关系型数据库之一,得到了越来越多企业的推广和运用,也越来越受到广大技术爱好者的欢迎和重视。这将是 PostgreSQL 的又一次交流盛会。




----------------------------------------

点击报名>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP