免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 5436 | 回复: 27
打印 上一主题 下一主题

[文本处理] 请问shell能不能对使用正则匹配到的某组内容进行替换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-07-01 13:54 |只看该作者 |倒序浏览
本帖最后由 limaoyuan 于 2014-07-01 13:57 编辑

我只知道可以把匹配到的内容显示出来。如红色标识的是第一个匹配和第二个匹配的内容。

原始文件  test1.log
  1. first:second
  2. one:two
复制代码
交换第2和第1匹配段的内容位置
  1. sed 's/\(.*\):\([a-z]*\)/\2:\1/g' test1.log
复制代码
输出:
  1. second:first
  2. two:one
复制代码
我的问题是:
有没有方
法我把正则匹配的内容更改掉,比如我把第2组匹配的内容换成AAA

期望上面的结果会是
  1. first:AAA
  2. one:AAA
复制代码
PS:只能用替换正则匹配到的某组内容替换的方式,不限于AWK的sub或SED等。


论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
2 [报告]
发表于 2014-07-01 13:58 |只看该作者
目测一下:
  1. awk -F: -vOFS=: '{$2="AAA"}1'
复制代码
  1. sed 's/[^:]\+$/AAA/'
复制代码

论坛徽章:
0
3 [报告]
发表于 2014-07-01 14:03 |只看该作者
通常情况下,好像是先知道可以
s/aaa/bbb/
后知道可以
s/\(aaa\)/\1/

论坛徽章:
0
4 [报告]
发表于 2014-07-01 14:14 |只看该作者
回复 2# yestreenstars

你好:
    awk -F: -vOFS=: '{$2="AAA"}1'  后面的1是什么意思?


另外这种方式不是我想问的那种,比如用很复杂的一个正则来满足匹配了一行,然后要替换掉正则中第4组的内容为”XXX“其他的内容不变。

论坛徽章:
0
5 [报告]
发表于 2014-07-01 14:16 |只看该作者
回复 3# 用户名注册后不能更改


    你这第二句只是把匹配到的内容再显示出来吧?没有用正则分组并替换第2组内容的意思

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-07-01 14:17 |只看该作者
回复 1# limaoyuan
不是非常理解楼主的意图,特别是这句:
  1. 只能用替换正则匹配到的某组内容替换的方式,不限于AWK的sub或SED等
复制代码
光从文本来看,目测这样就可以了。
  1. sed 's/[a-z]*/AAA/2' i
  2. first:AAA
  3. one:AAA
复制代码

论坛徽章:
0
7 [报告]
发表于 2014-07-01 14:22 |只看该作者
本帖最后由 limaoyuan 于 2014-07-01 14:23 编辑

回复 6# Herowinter

简单说就是能否把下面这句中 \2 匹配的部分换成AAA。
  1. sed 's/\(.*\):\([a-z]*\)/\2:\1/g' test1.log
复制代码
当然这只是一个简单的例子,实际工作中可能是\7或\10都有可能,正式也要复杂很多,只是想知道这种形式的替换,shell可否,谢谢。
   

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
8 [报告]
发表于 2014-07-01 14:24 |只看该作者
回复 7# limaoyuan

应该可以,其实你还是给个比较真实的例子吧,
星辰大大的代码应该没什么问题的,除非你字段
之间的分割符不是“:”。
   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
9 [报告]
发表于 2014-07-01 14:26 |只看该作者
回复 7# limaoyuan
sed不支持9以上的分组~{:2_172:}

   

论坛徽章:
32
处女座
日期:2013-11-20 23:41:20双子座
日期:2014-06-11 17:20:43戌狗
日期:2014-06-16 11:05:00处女座
日期:2014-07-22 17:30:47狮子座
日期:2014-07-28 15:38:17金牛座
日期:2014-08-05 16:34:01亥猪
日期:2014-08-18 13:34:25白羊座
日期:2014-09-02 15:03:55金牛座
日期:2014-11-10 10:23:58处女座
日期:2014-12-02 09:17:52程序设计版块每日发帖之星
日期:2015-06-16 22:20:002015亚冠之塔什干火车头
日期:2015-06-20 23:28:22
10 [报告]
发表于 2014-07-01 14:27 |只看该作者
回复 4# limaoyuan
  1. sed 's/\(.*\):\([a-z]*\)/\1:AAA/g'
复制代码
酱紫可以吗?

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP