LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1039|回复: 5

如何写这样一个脚本??

[复制链接]
发表于 2008-1-14 16:51:58 | 显示全部楼层 |阅读模式
可以使用sed ,awk

我们经常在文件里面有写定义 #define ABC 1
请问如何写个脚本替换ABC的定义为2???
也就是得到 #define ABC 2 这样的结果
发表于 2008-1-14 19:10:10 | 显示全部楼层
用sed替换即可。需要考虑如下情况:
ABCABC  
ABCDE
AAABCD
ABC ABC
(tab)ABC(空格)
......
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-15 13:53:54 | 显示全部楼层
希望能够有高手能够解决此问题,困扰我许久了
回复 支持 反对

使用道具 举报

发表于 2008-1-15 17:38:28 | 显示全部楼层
抱歉,原来理解错你的意思了。 试试这个命令:
$ sed '/#define[ \t][ \t]*ABC[ \t]/s/1/2/' file1 > file2
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-1-16 10:22:04 | 显示全部楼层
Post by chunchengfh;1807457
抱歉,原来理解错你的意思了。 试试这个命令:
$ sed '/#define[ \t][ \t]*ABC[ \t]/s/1/2/' file1 > file2


如果在实现不知道定义为1的情况下,如何做呢?

原来的情况:
#define ABC [Unknow]
变成:
#define ABC 2
回复 支持 反对

使用道具 举报

发表于 2008-1-16 10:48:39 | 显示全部楼层
那只要将符合要求的行直接替换即可:
  1. $ sed '/#define[ \t][ \t]*ABC[ \t]/s/^.*$/#define ABC 2/' file1 > file2
复制代码

以上表达式基本等价于:
  1. $ sed 's/#define[ \t][ \t]*ABC[ \t].*$/#define ABC 2/' file1 > file2
复制代码


PS:
提问时尽量将要求写清楚一点,因为不同的命令都会有它的局限之处,所以需求越精确越好。
比如上面的表达式作用于如下行
printf("#define ABC %s\n", "hello");
第一个命令会得到:
#define ABC 2
第二个命令则得到:
printf("#define ABC 2
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表