免费注册 查看新帖 |

Chinaunix

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

1,$s/\(.*\) \(.*\)/$2--$1/g [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-02 22:02 |只看该作者 |倒序浏览
10可用积分
abcde  ABCED
beijing  BEIJING


如果运行如下命令:
1,$s/\(.*\) \(.*\)/\2--\1/g

则结果为:

ABCED--abcde
BEIJING--beijing


请哪位能帮我具体解释一下这个正则表达式吗?谢谢!

最佳答案

查看完整内容

天啊,这就10分,我来吧\(.*\) \(.*\).表示任意字符,*表示任意多个前面的字符,包括零个(注意有贪婪性,就是有多少吃多少,只要符合条件)\(.*\)是将括号里面的用标签标记起来,按出现的顺序依次为1,2,3...,可以用\1,\2...来提取所以\(.*\) \(.*\)就表示,"几个任意字符"+"一个空格"+"几个字符"的形式字符串,而1,$s/\(.*\) \(.*\)/\2--\1/g这句sed语句就是将1行到结束行的,符合上述条件的字符串,替换成"第二段字符"--"第一段 ...

论坛徽章:
0
2 [报告]
发表于 2009-12-02 22:02 |只看该作者
天啊,这就10分,我来吧
\(.*\) \(.*\)
.表示任意字符,
*表示任意多个前面的字符,包括零个(注意有贪婪性,就是有多少吃多少,只要符合条件)
\(.*\)是将括号里面的用标签标记起来,按出现的顺序依次为1,2,3...,可以用\1,\2...来提取
所以\(.*\) \(.*\)就表示,"几个任意字符"+"一个空格"+"几个字符"的形式字符串,
而1,$s/\(.*\) \(.*\)/\2--\1/g这句sed语句就是将1行到结束行的,符合上述条件的字符串,替换成"第二段字符"--"第一段字符"的形式

明白没?

[ 本帖最后由 haimming 于 2009-12-2 22:12 编辑 ]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
3 [报告]
发表于 2009-12-02 22:14 |只看该作者

回复 #1 reneyangs 的帖子


  1. 1,$s/\(.*\) \(.*\)/\2--\1/g

  2. 1,$ 表示第一行到最后一行,可以省去
  3. s/
  4. \(.*\) \(.*\) 括号需要“\”来转义,实际就是(.*) (.*),对于第一行abcde ABCED来说就是(abcde) (ABCED),那么\1就是abcde,\2就是ABCED
  5. /\2--\1/g
复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2009-12-02 22:15 |只看该作者

回复 #2 haimming 的帖子

你好快啊

论坛徽章:
0
5 [报告]
发表于 2009-12-02 22:16 |只看该作者

回复 #2 haimming 的帖子

那我如果要匹配(,不是也需要加一个\(的么?
这两种如何区分?

论坛徽章:
5
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:50:282015年亚洲杯之朝鲜
日期:2015-03-13 22:47:33IT运维版块每日发帖之星
日期:2016-01-09 06:20:00IT运维版块每周发帖之星
日期:2016-03-07 16:27:44
6 [报告]
发表于 2009-12-02 22:17 |只看该作者
原帖由 haimming 于 2009-12-2 22:10 发表
天啊,这就10分,我来吧



论坛徽章:
0
7 [报告]
发表于 2009-12-02 22:25 |只看该作者

回复 #5 reneyangs 的帖子

这要看sed了,如果sed加了-r参数,可以像beginner-bj 说的那样
sed -r 's/(.*) (.*)/\2--\1/g',而这里要匹配"("和")"是要转义的
相反,如果不加就要写成sed 's/\(.*\) \(.*\)/\2--\1/g',这时匹配"("和")"是不需要转义,直接来就是
[rockfall@Rocfall ~/tmp/sh/A]$echo "a(b"|sed 's/(/--/'
a--b
[rockfall@Rocfall ~/tmp/sh/A]$echo "a(b"|sed -r 's/(/--/'
sed: -e expression #1, char 7: Unmatched ( or \(
[rockfall@Rocfall ~/tmp/sh/A]$echo "a(b"|sed -r 's/\(/--/'
a--b

[ 本帖最后由 haimming 于 2009-12-2 22:35 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2009-12-02 22:36 |只看该作者

回复 #7 haimming 的帖子

那我如果在vi命令模式下,使用 :1,$s/(.*) (.*)/\2--\1/g,似乎不行?

论坛徽章:
0
9 [报告]
发表于 2009-12-02 22:49 |只看该作者

回复 #8 reneyangs 的帖子

vi里应该用你第一种的形式,
不过估计也能设置成这种,没怎么用vi不会

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2009-12-02 22:50 |只看该作者
原帖由 haimming 于 2009-12-2 22:10 发表
天啊,这就10分,我来吧
\(.*\) \(.*\)
.表示任意字符,
*表示任意多个前面的字符,包括零个(注意有贪婪性,就是有多少吃多少,只要符合条件)
\(.*\)是将括号里面的用标签标记起来,按出现的顺序依次为1,2, ...

哈哈, 这10分好挣8?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP