- 论坛徽章:
- 1
|
问一个关于替换的问题
原帖由 "auser" 发表:
...
不过看的我头都晕了,可否解释一下?
原帖由 "labrun" 发表:
请教一下woodie的方法中
$ sed -e "s:[^/]*\(/[^/]\{1,\}\)*//::" testfile
我对其中的括弧的使用(/[^/]\{1,\}\) 还不是很明白。
在这里的怎么讲?
- $ sed -e "s:[^/]*\(/[^/]\{1,\}\)*//::" testfile
复制代码
首先用":"替换了sed命令行中“s”命令的分隔符"/",这样作为普通字符的"/"就不需要转义了,可读性好些。小括号用来对表达式进行分组,并且后面还可以对它括起的子表达式进行向前引用。"{1,}"等价于"+"表示前面的子式一次以上的出现。而且因为用在shell命令行中,所以小括号和花括号都必须转义。
如何构造这个这表达式呢?
第一步,比较简单的想法就是匹配".*//",然后删除它,但是会把第二个、第三个"//"也删除,不合楼主原意。
第二步,如果用"[\/]*//"的话虽然不会匹配第二、第三个“//”,但是也不行,象"/http:/www.163.com//"也不能被匹配。
第三步,在我们的正则表达式中加入单个“/”的匹配,我们来看括号中的片段,实际上是:
“/[^/]{1,}”
"[^/]{1,}"匹配非"/"的字符至少出现一次,那么“/[^/]{1,}”就匹配"/a", "/1234", 但关键是不能匹配单个或连续的“/”如"/", "//", "////"等等, 以免把第一个“//”也匹配在其中。
那么"(/[^/]{1,})*"就是匹配单个"/"加至少一个非"/"字符的子表达式0次或多次的出现。然后再加上"/"字符可能不出现的情况,最后的表达式就写成这样:
对小括号和花括号转义后就是:
|
|