Chinaunix

标题: sed 替换行中指定位置的字符串 [打印本页]

作者: 巽离linux    时间: 2013-11-12 10:19
标题: sed 替换行中指定位置的字符串
大家好!
我现在有个文件,第一行是这样子的:
    somename  (1234-0pattern11.2)
写的替换脚本是这个:
       sed -i '1{s/pattern/shine/};ta;1{s/)/shine)/};:a'   filename  # 有pattern就替换,没有就直接在右括号前面加shine


但是,还有这种情况
    pattern-somename (1234-0pattern11.2)
   就将第一个pattern给替换成shine了

    shine-somename (1234-0pattern11.2)
跟我想得到的结果不一样,实际想替换的是括号中的pattern

请问大家,怎么样可以定位到()里面匹配替换呢?

谢谢谢谢!
作者: seesea2517    时间: 2013-11-12 10:37
是这样的效果吧:
  1. [seesea@UC ~]# echo "somename  (1234-0pattern11.2) " |  sed '1{s/pattern/shine/};ta;1{s/)/shine)/};:a'
  2. somename  (1234-0shine11.2)
  3. [seesea@UC ~]# echo "pattern-somename  (1234-0pattern11.2) " |  sed '1{s/pattern/shine/};ta;1{s/)/shine)/};:a'
  4. shine-somename  (1234-0pattern11.2)
  5. [seesea@UC ~]# echo "pattern-somename  (1234-0pattern11.2) " |  sed '1{s/[^^]pattern/shine/};ta;1{s/)/shine)/};:a'
  6. pattern-somename  (1234-shine11.2)
复制代码

作者: yestreenstars    时间: 2013-11-12 10:38
本帖最后由 yestreenstars 于 2013-11-12 10:42 编辑
  1. [root@localhost ~]# cat i
  2. pattern-somename (1234-0pattern11.2)
  3. pattern-somename (1234-0test11.2)
  4. [root@localhost ~]# sed -r 's/(\([^)]*)pattern([^)]*\))/\1shine\2/g;t;s/\)/shine&/' i
  5. pattern-somename (1234-0shine11.2)
  6. pattern-somename (1234-0test11.2shine)
  7. [root@localhost ~]#
复制代码

作者: reyleon    时间: 2013-11-12 10:43
本帖最后由 reyleon 于 2013-11-12 10:49 编辑
  1. sed -r 's/(\(.*)pattern(.*\))/\1shine\2/;t;s/\)$/shine&/;'
复制代码

作者: 巽离linux    时间: 2013-11-12 10:46
seesea2517 发表于 2013-11-12 10:37
是这样的效果吧:



谢谢,是要这样的,能说明下 [^^] 是什么意思吗? 这种用法之前没碰到过
作者: 巽离linux    时间: 2013-11-12 10:48
reyleon 发表于 2013-11-12 10:43


我也一直想用标签来着,但是一直出错,谢谢啊,哈哈
作者: 巽离linux    时间: 2013-11-12 10:50
谢谢大家,这么快就解决了,生活太美好啦
作者: 小C_笑话    时间: 2013-11-12 19:47
我刚刚开始学,问下lz,这个ta  :a  和1{}属于哪一块知识点呢?我刚学没见过
作者: seesea2517    时间: 2013-11-13 09:35
回复 5# 巽离linux


    这里有三个知识点:[] 表示一个符号集合,第二个 ^ 表示开头的锚点,第一个 ^ 表示对[]中的集合取反,即表示不在开头的位置了。如果其它的正则工具可以考虑使用零宽断言,但sed不支持所以就写的这么不好看了。
作者: 巽离linux    时间: 2013-11-14 17:51
回复 8# 小C_笑话


    这是标签,:a定义标签位置。ta表示如果发生替换动作的话,就跳到这个标签来
作者: 巽离linux    时间: 2013-11-14 17:52
回复 9# seesea2517


    谢谢详细讲解  




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