LinuxSir.cn,穿越时空的Linuxsir!

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

高难度shell 问题

[复制链接]
发表于 2007-12-4 15:13:26 | 显示全部楼层 |阅读模式
sessMgr_CXXFLAGS = \
                -I.. -I../.. \
                -I$(MMX_PATH)/oam/lib \
                -I$(MNODE_PATH)/gan \
                -I$(MMX_PATH) \
                -I$(VENDOR_PATH) \
                -I$(MMX_PATH)/inc \
                -I$(MMX_PATH)/common \
                -I$(MMX_PATH)/oam/include \
                -I$(MNODE_PATH)/subMgr \
                -I$(MNODE_PATH)/imgSubMgr \
                -I$(MNODE_PATH)/honMgr \
                -I$(MNODE_PATH)/mainCC \
                -I$(MMX_PATH)/common \
                -I$(MMX_PATH)/mxLog \
                -I$(MMX_PATH)/mmx/mxLog/inc \
                -I$(MMX_PATH)/mxLog/inc \
                -I$(MMX_PATH)/oam/src/evm/inc \
                -I$(MMX_PATH)/oam/src/tmm \
                -I$(MMX_PATH)/commMgr/commLib/inc  \
                -I$(MNODE_PATH)/gan/ganms \
                -I$(MNODE_PATH)/gan/gannet \
                -I$(MNODE_PATH)/gan/common \
                -I$(MNODE_PATH)/gan/gprsBridge \
                -I$(MNODE_PATH)/gan/ganMgr \
                -I$(MNODE_PATH)/mgc \
                -I$(MNODE_PATH)/aif/netmm/src \
                -I$(MNODE_PATH)/aif \
                -I$(MNODE_PATH)/aif/mscc\
                -I$(MNODE_PATH)/aif/msmm \
                -I$(MNODE_PATH)/aif/msmm/inc \
                -I$(MNODE_PATH)/parser/base \
                -I$(MNODE_PATH)/parser/gsm \
                -I$(MNODE_PATH)/parser/uma \
                -I$(MNODE_PATH)/parser/bssap \
                -I$(MNODE_PATH)/parser/xml \
                -I$(MNODE_PATH)/aif/netmm \
                -I$(MNODE_PATH)/sipUA \
                -I$(MNODE_PATH)/switch \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/appWeb \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/http \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/http/modules \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/esp \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/ejs \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4/mpr \
                -I$(VENDOR_PATH)/mbedthis/appWeb/appWeb-2.0.4 \
                -I$(VENDOR_PATH)/trillium/Common        \
                -I$(VENDOR_PATH)/trillium/MAP           \
                -I$(VENDOR_PATH)/trillium/SSUnix        \
                -I$(VENDOR_PATH)/trillium/SysCommon \
                -I$(HSSUA_PATH)/uatk_headers \
                -I$(HSSSTACK_PATH)/stack_headers \
                -DLINUX -D_REENTRANT

我如何才能把以-I开头的行都去掉(前题是必须位于CXXFLAGS子项中)
发表于 2007-12-4 15:30:27 | 显示全部楼层
  1. sed '/CXXFLAGS/{:a;N;/\\$/ba;s/-I[^\n]*\n//g}'  数据文件
复制代码

解释:
/CXXFLAGS/{...}  遇到有CXXFLAGS的行,开始{}中的一系列操作

:a;N;/\\$/ba  只要结尾是\的,就读入下一行,因为在\表示连接符,就是下面的行与当前行是一个逻辑行,因此需要把它读进来

s/-I[^\n]*\n//g  把当前模式空间中的-I开始,到它后面的第一个换行符(包括换行符)之间的内容全部删除
注:  这种方式对于在行中不出现-I的情况是正确的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-4 15:37:21 | 显示全部楼层
springwind426,你太天才了,可以交个朋友吗?
我的msn:yvqq@hotmail.com
你这个写法我实在看不懂,呵呵
回复 支持 反对

使用道具 举报

发表于 2007-12-4 20:20:38 | 显示全部楼层
try:
grep -v '^-I.*CXXFLAGS'
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-5 09:01:23 | 显示全部楼层
NETMAN 理解错误了,springwind426的写法是完全正确的,我只是再请教这个写法的具体含义
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-12-5 09:09:02 | 显示全部楼层
sed -i '/CXXFLAGS/{:a;N;/\\$/ba;s/\t*\-\I[^\n]*\n//g}  我改了一点点,但希望再将它完善一下,条件改成以下:
   1.    -I开头的并且中间包含"/"这个符号(这样基本可以确定是一个路径)的内容删除
  2.    能够处理将上面的语句写在一行,而不是以"\"分隔的多行的情况

另:a;N;/\\$/ba 这是一个loop对吗? :a 是一个设置一个标记a,碰到\这个结尾就用b跳转函数跳到标记a处,真到找不到以\结束的行
回复 支持 反对

使用道具 举报

发表于 2007-12-5 16:56:16 | 显示全部楼层
我只是提供給你“另”一種方法去嘗試。
沒否定前面的可行性。
回复 支持 反对

使用道具 举报

发表于 2007-12-5 19:11:44 | 显示全部楼层
  1. sed '/CXXFLAGS/{:a;/\\$/N;s/\\\n//;ta;s/-I[^ ]\+ \?//g}'
复制代码

解释:
当遇到含有CXXFLAGS的时候,:a;/\\$/N;s/\\\n//;ta; 这个是处理,如果有\结尾的话,就把下面一行读出来,同时删除\和搬行符,实际上就是合并逻辑行为物理行
s/-I[^ ]\+ \?//g  把-I一直到空格之间的内容(包括后面的空格)删除,这样就去除了所有的-I声明。只是这样处理以后,修改了原来的行结构,所有的CXXFLAGS的逻辑行被合并到一个物理行了(不影响结果,不过可能影响美观)。
\? 表示最多一个空格,之所以这么加,是为了去除可能出现的最后一个参数上的-I声明
比如
CXXFLAGS= .... -I....  这样的情况。

因为使用了条件处理,对于那些原来就写在一行内的声明也是可以处理的。
回复 支持 反对

使用道具 举报

发表于 2007-12-9 17:45:47 | 显示全部楼层
Post by springwind426;1792010
  1. sed '/CXXFLAGS/{:a;/\\$/N;s/\\\n//;ta;s/-I[^ ]\+ \?//g}'
复制代码
解释:
当遇到含有CXXFLAGS的时候,:a;/\\$/N;s/\\\n//;ta; 这个是处理,如果有\结尾的话,就把下面一行读出来,同时删除\和搬行符,实际上就是合并逻辑行为物理行
s/-I[^ ]\+ \?//g  把-I一直到空格之间的内容(包括后面的空格)删除,这样就去除了所有的-I声明。只是这样处理以后,修改了原来的行结构,所有的CXXFLAGS的逻辑行被合并到一个物理行了(不影响结果,不过可能影响美观)。
\? 表示最多一个空格,之所以这么加,是为了去除可能出现的最后一个参数上的-I声明
比如
CXXFLAGS= .... -I....  这样的情况。

因为使用了条件处理,对于那些原来就写在一行内的声明也是可以处理的。

楼上的就是强人,不止看到你一次写出这么精彩的脚步了
能说说你开始是怎么学sed的吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

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