Chinaunix

标题: sed 这句话什么意思请帮我解释一下 [打印本页]

作者: zhubowen_636    时间: 2008-10-27 11:29
标题: sed 这句话什么意思请帮我解释一下
从论坛中看到这么一个语句主要用于+86-010-12312312/45645666
+86022-56756756/56567675/56767656/56767656
替换成
+86-010-12312312/+86-010-45645666
+86-022-56756756/+86-022-56567675/+86-022-56767656/+86-022-56767656
用的语句是sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3#;ta' 前半部分's/(\+..)([^-])/\1-\2/能够理解,但是后面 后面的语句好多的参数没有用过请哪位大侠帮我解释一下
问题1 :a这个参数的作用是什么
问题2  后面的#号是做什么的 我看前面没有这个东西啊。(也许是我对:a不理解的原因吧)
问题3  ta这个参数是什么意思呢??以前没有听说过。
作者: blackold    时间: 2008-10-27 11:37
标题: 回复 #1 zhubowen_636 的帖子
a是标签名,label
#是RE分隔符,相当于/
ta 是t命令,a是前面定义的标签。
作者: sunceenjoy    时间: 2008-10-27 11:37
:a是一个标识.
ta表示s#...这个匹配成功的话就跳转到:a后面,如此循环直到s#不匹配

如果是ba的话,就表示无条件跳转了。(ba,还是fa?忘记了)
作者: zhubowen_636    时间: 2008-10-27 13:27
想问一下这个地方为什么必须用#号才可以执行成功,用/就会出现语法错误呢???什么时候用#而不用/我觉得很奇怪
[root@localhost ~]# sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3/;ta' test1
sed: -e expression #1, char 57: unterminated `s' command

sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3#;ta' test1
+86-010-12312312/+86-010-45645666
+86-022-56756756/+86-022-56567675/+86-022-56767656/+86-022-56767656
作者: leetaedong    时间: 2008-10-27 13:38
原帖由 zhubowen_636 于 2008-10-27 13:27 发表
想问一下这个地方为什么必须用#号才可以执行成功,用/就会出现语法错误呢???什么时候用#而不用/我觉得很奇怪
[root@localhost ~]# sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3/;ta' te ...

避免岐义的意思.
有双重解释意思的时候, sed 怎么知道用哪个?
不是你认为它应该这样, sed就会这样.

自己想想.
作者: merlin852    时间: 2008-10-27 13:39
原帖由 zhubowen_636 于 2008-10-27 13:27 发表
想问一下这个地方为什么必须用#号才可以执行成功,用/就会出现语法错误呢???什么时候用#而不用/我觉得很奇怪
[root@localhost ~]# sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3/;ta' te ...


因为你替换的内容里有/,sed分不清你的/是要替换的内容还是分隔符
作者: zhubowen_636    时间: 2008-10-27 13:55
原帖由 leetaedong 于 2008-10-27 13:38 发表

避免岐义的意思.
有双重解释意思的时候, sed 怎么知道用哪个?
不是你认为它应该这样, sed就会这样.

自己想想.

谢谢!!!!我明白了.
作者: ynchnluiti    时间: 2008-10-27 13:55
原帖由 zhubowen_636 于 2008-10-27 13:27 发表
想问一下这个地方为什么必须用#号才可以执行成功,用/就会出现语法错误呢???什么时候用#而不用/我觉得很奇怪
[root@localhost ~]# sed -r 's/(\+..)([^-])/\1-\2/;:a;s#(.*-)(.*/)([^+]+)#\1\2\1\3/;ta' te ...

不是只能用/,可以用其他字符,s#old#new# 或者sAoldAnewA(s后面的第一个字符做分隔符)。 用#可以省去对内容中的/转义
作者: ynchnluiti    时间: 2008-10-27 13:56
标题: 回复 #7 zhubowen_636 的帖子
被楼主抢先了
作者: wuxb45    时间: 2008-10-27 18:02
啊,原来是我提的问题,小弟学艺不精,后来看了半天书终于看懂了,cu的达人们太强了




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