免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: auser
打印 上一主题 下一主题

问一个关于替换的问题  关闭 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
11 [报告]
发表于 2004-03-25 18:31 |只看该作者

问一个关于替换的问题

还是woodie的办法高(bjgirl可别生气,你的这个办法和我那个split的方法是一样的,我主要问的是正则表达式问题)!
不过看的我头都晕了,可否解释一下?

论坛徽章:
0
12 [报告]
发表于 2004-03-25 18:35 |只看该作者

问一个关于替换的问题

原帖由 "auser" 发表:
还是woodie的办法高(bjgirl可别生气,你的这个办法和我那个split的方法是一样的,我主要问的是正则表达式问题)!
不过看的我头都晕了,可否解释一下?
我什么生气? 能多学到知识,高兴还来不及呢
我对awk不懂,正好用这个例子自己多练练嘛

论坛徽章:
0
13 [报告]
发表于 2004-03-25 18:39 |只看该作者

问一个关于替换的问题

[quote]原帖由 "woodie"][/quote 发表:

good,不过-e 有些多余

论坛徽章:
0
14 [报告]
发表于 2004-03-26 09:47 |只看该作者

问一个关于替换的问题

请教一下woodie的方法中
$ sed -e "s:[^/]*\(/[^/]\{1,\}\)*//::" testfile
我对其中的括弧的使用(/[^/]\{1,\}\) 还不是很明白。
在这里的怎么讲?

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

问一个关于替换的问题

原帖由 "auser" 发表:
...
不过看的我头都晕了,可否解释一下?

原帖由 "labrun" 发表:
请教一下woodie的方法中
$ sed -e "s:[^/]*\(/[^/]\{1,\}\)*//::" testfile
我对其中的括弧的使用(/[^/]\{1,\}\) 还不是很明白。
在这里的怎么讲?

  1. $ sed -e "s:[^/]*\(/[^/]\{1,\}\)*//::" testfile
复制代码


首先用":"替换了sed命令行中“s”命令的分隔符"/",这样作为普通字符的"/"就不需要转义了,可读性好些。小括号用来对表达式进行分组,并且后面还可以对它括起的子表达式进行向前引用。"{1,}"等价于"+"表示前面的子式一次以上的出现。而且因为用在shell命令行中,所以小括号和花括号都必须转义。

如何构造这个这表达式呢?
第一步,比较简单的想法就是匹配".*//",然后删除它,但是会把第二个、第三个"//"也删除,不合楼主原意。

第二步,如果用"[\/]*//"的话虽然不会匹配第二、第三个“//”,但是也不行,象"/http:/www.163.com//"也不能被匹配。

第三步,在我们的正则表达式中加入单个“/”的匹配,我们来看括号中的片段,实际上是:
“/[^/]{1,}”
"[^/]{1,}"匹配非"/"的字符至少出现一次,那么“/[^/]{1,}”就匹配"/a", "/1234", 但关键是不能匹配单个或连续的“/”如"/", "//", "////"等等, 以免把第一个“//”也匹配在其中。
那么"(/[^/]{1,})*"就是匹配单个"/"加至少一个非"/"字符的子表达式0次或多次的出现。然后再加上"/"字符可能不出现的情况,最后的表达式就写成这样:
  1. [^/]*(/[^/]{1,})*//
复制代码

对小括号和花括号转义后就是:
  1. [^/]*\(/[^/]\{1,\}\)*//
复制代码

论坛徽章:
0
16 [报告]
发表于 2004-03-26 14:32 |只看该作者

问一个关于替换的问题

谢谢。

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

问一个关于替换的问题

想到另一种写法,更简单一点:

  1. $ cat testfile
  2. http:/www.163.com//www.126.com/
  3. /http:/www.163.com//www.126.com/
  4. //http:/www.163.com//www.126.com/
  5. http:/www.163.com//www.126.com//
  6. http:/www.163.com/www.126.com/
  7. $ sed -e "s:\([^/]\|/[^/]\)*//::" testfile
  8. www.126.com/
  9. www.126.com/
  10. http:/www.163.com//www.126.com/
  11. www.126.com//
  12. http:/www.163.com/www.126.com/
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
18 [报告]
发表于 2004-03-29 15:24 |只看该作者

问一个关于替换的问题

原帖由 "woodie" 发表:

想到另一种写法,更简单一点
$ sed -e "s:\([^/]\|/[^/]\)*//::" testfile


精彩,击中要害!

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
19 [报告]
发表于 2004-03-29 18:38 |只看该作者

问一个关于替换的问题

只用shell变量操作可以这样,也很简单:
  1. $  while read line; do echo ${lline#*//}; done < testfile
  2. www.126.com/
  3. www.126.com/
  4. http:/www.163.com//www.126.com/
  5. www.126.com//
  6. http:/www.163.com/www.126.com/
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
20 [报告]
发表于 2004-03-29 20:45 |只看该作者

问一个关于替换的问题

问题起源是做一个增强型的ping
系统自带的ping不能
ping http://www.xxx.com/index.htm

于是做了一个pin:

cat /usr/bin/pin
$ cat /usr/bin/pin
#!/bin/sh

HOST=${1#*//}
HOST=${HOST%%/*}
echo HOSTHOST
shift
/bin/ping $HOST "$@"

现在就可以
pin http://www.xxx.com/index.htm
了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP