Chinaunix

标题: 替换文件内容,求帮忙 [打印本页]

作者: gxxiaotian    时间: 2014-05-08 15:54
标题: 替换文件内容,求帮忙
文件内容大概如下:
char szSecuAcc[12];
char T354_szSecuAcc_WO[11];
stSecuAcc
secuacc
现在想要的是,包含SecuAcc的行(此字符串不区分大小写),并且此行有[]符号的行,将[]中的数字替换成22
作者: jason680    时间: 2014-05-08 16:06
回复 1# gxxiaotian

How about this ...

$ sed -r 's/(SecuAcc[^[]*)\[[0-9]+\]/\1[22]/ig' FILE
char szSecuAcc[22];
char T354_szSecuAcc_WO[22];
stSecuAcc
secuacc

   
作者: gxxiaotian    时间: 2014-05-08 16:07
可以用awk写个么,谢谢了回复 2# jason680


   
作者: Herowinter    时间: 2014-05-08 16:11
回复 1# gxxiaotian
  1. sed -r '/[Ss][Ee][Cc][Uu][Aa][Cc]{2}/s/\[.*\]/[22]/' i
  2. char szSecuAcc[22];
  3. char T354_szSecuAcc_WO[22];
  4. stSecuAcc
  5. secuacc
复制代码

作者: Herowinter    时间: 2014-05-08 16:16
回复 3# gxxiaotian
  1. awk 'BEGIN{IGNORECASE=1} /SecuAcc/{sub(/\[.*\]/,"[22]");print}' i
  2. char szSecuAcc[22];
  3. char T354_szSecuAcc_WO[22];
  4. stSecuAcc
  5. secuacc
复制代码

作者: gxxiaotian    时间: 2014-05-08 16:17
非常感谢回复 5# Herowinter


   
作者: jeffreyst    时间: 2014-05-08 16:18
sed -r '/[Ss][Ee][Cc][Uu][Aa][Cc][Cc]/s/(.*\[)[0-9]+(\].*)/\122\2/' file
char szSecuAcc[22];
char T354_szSecuAcc_WO[22];
stSecuAcc
secuacc

这样[Ss][Ee][Cc][Uu][Aa][Cc][Cc]匹配不区分大小写的字串,不太好看
有更先进的办法吗?哪位大神帮忙解答下...
作者: jeffreyst    时间: 2014-05-08 16:18
本帖最后由 jeffreyst 于 2014-05-08 16:25 编辑

回复 2# jason680


更正下,这个语句可以实现匹配忽略大小写的字串,但是不太明白原理,研究中!
作者: jason680    时间: 2014-05-08 16:18
回复 3# gxxiaotian

Here you are

$ awk -vIGNORECASE=1 '{$0=gensub(/(SecuAcc[^\[]*)\[[0-9]+\]/, "\\1[22]","g")}1' FILE
char szSecuAcc[22];
char T354_szSecuAcc_WO[22];
stSecuAcc
secuacc

   
作者: Herowinter    时间: 2014-05-08 16:18
回复 7# jeffreyst
我也不会别的方法呀,坑爹的忽略大小写。


   
作者: jason680    时间: 2014-05-08 16:19
回复 8# jeffreyst

How to know ?
   
作者: jeffreyst    时间: 2014-05-08 16:23
回复 11# jason680


    sorry!你的语句是可以的,但是没看太懂,给大伙儿解释下原理,多谢了~
   
作者: jason680    时间: 2014-05-08 16:25
回复 12# jeffreyst

s/old/new/ig

i for ignorecase
g for global
   
作者: jeffreyst    时间: 2014-05-08 16:31
本帖最后由 jeffreyst 于 2014-05-08 16:36 编辑

回复 13# jason680


    我把i理解成insert了, 所以咋看都不对头...多谢提点!
    我这个半吊子,再不好好学习就不行了
  1. cat 1
  2. char szsecuAcc[12];
  3. char T354_szSEcuAcc_WO[11];
  4. stSecuAcC
  5. secuaCc
  6. [root@]#
  7. [root@]# cat 1 |sed 's/secuAcc/xxx/i'
  8. char szxxx[12];
  9. char T354_szxxx_WO[11];
  10. stxxx
  11. xxx
复制代码

作者: yestreenstars    时间: 2014-05-08 23:49
  1. perl -pe 's/\[[^]]+\]/[22]/g if /SecuAcc/i'
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2