sh/bash/dash/ksh/zsh等Shell脚本
-
shadow
- 帖子: 10
- 注册时间: 2005-07-14 14:44
#1
帖子
由 shadow » 2007-03-10 8:18
代码: 全选
我用 sed 的时候,需要用到最短匹配。按照 sed 手册,针对字符串:
foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things.
\---------------------/
\--------------------------------------------------------/
A[^T]*T
就可以匹配
foo bar A xxx some other characters T
而非
foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 T
然而,我的麻烦在于,我希望匹配的标记,是多字符(Tag)而非单字符(T)。
请问应当写怎样的正则表达式,才能从 A 匹配到 第一个 Tag 呢?
如下图
foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things.
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
先谢了!
以上为了使用等宽字体对齐,使用了代码格式。
-
5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
#2
帖子
由 5451vs5451 » 2007-03-10 10:03
A([^T]|T[^a]|Ta[^g])*Tag
-
shadow
- 帖子: 10
- 注册时间: 2005-07-14 14:44
#3
帖子
由 shadow » 2007-03-10 11:27
对了!
十分感谢。不过其他朋友注意,因为使用了扩展正则表达式,似应在 sed 命令行中使用 -r 选项。如下:
代码: 全选
$ sed -r -e 'A([^T]|T[^a]|Ta[^g])*Tag' somefile
-
zanefei
- 帖子: 76
- 注册时间: 2006-02-23 20:22
-
联系:
#4
帖子
由 zanefei » 2007-05-05 22:28
代码: 全选
echo "foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things. "| sed 's/.*A\(.*\)Tag.*Tag.*/\1/'
这样也可以取到的说
-
alinmn
- 帖子: 185
- 注册时间: 2006-05-19 21:42
- 来自: NIT
#5
帖子
由 alinmn » 2007-05-07 20:56
5451vs5451 写了:A([^T]|T[^a]|Ta[^g])*Tag
这个不能匹配Tag前面为T或Ta的,可以写作
A([^T]|T[^a]|Ta[^g])*(T|Ta)?Tag
-
alinmn
- 帖子: 185
- 注册时间: 2006-05-19 21:42
- 来自: NIT
#6
帖子
由 alinmn » 2007-05-07 21:10
zanefei 写了:代码: 全选
echo "foo bar A xxx some other characters Tee words Tag yyy other string zzz Tee 123 445 Tag the rest things. "| sed 's/.*A\(.*\)Tag.*Tag.*/\1/'
这样也可以取到的说
这个好像在有1个或两个以上Tag的时候结果不对
-
5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
#7
帖子
由 5451vs5451 » 2007-05-07 23:55
alinmn 写了:A([^T]|T[^a]|Ta[^g])*(T|Ta)?Tag
这个不能保证最短,它可与字符串 "A TaTag Tag" 相匹配。
真要把 TTag 和 TaTag 的情况考虑进去,我怀疑是否可以构造出一个符合条件的正则表达式。这种情况下倒不如用sed进行多次处理来得简单。
代码: 全选
sed -n '/A.*/p' | sed -n 's/Tag.*/Tag/p'
-
alinmn
- 帖子: 185
- 注册时间: 2006-05-19 21:42
- 来自: NIT
#8
帖子
由 alinmn » 2007-05-08 13:17
呵呵 刚试了一下 原来的也会匹配 A TaTag Tag 因为TaT会被Ta[^g]匹配,
A([^T]|(T*a)*[^Tg]|(T*a)*T+[^Ta])*(Ta?)*Tag 不会出现这种情况,
不过还是sed多次处理简单
上次由
alinmn 在 2007-05-12 14:03,总共编辑 1 次。
-
csbde
- 帖子: 27
- 注册时间: 2006-10-20 12:35
#9
帖子
由 csbde » 2007-05-10 23:36
不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'
OVER
-
5451vs5451
- 帖子: 345
- 注册时间: 2006-07-14 18:56
- 来自: Apple Valley, Planet Tux, Linux System
#10
帖子
由 5451vs5451 » 2007-05-11 0:21
csbde 写了:不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'
OVER
不知所云。
代码: 全选
$ echo A Tag Tag Tag | sed 's/.*\(A.*T\).*/\1/g'
A Tag Tag T
-
csbde
- 帖子: 27
- 注册时间: 2006-10-20 12:35
#11
帖子
由 csbde » 2007-05-11 13:02
5451vs5451 写了:csbde 写了:不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'
OVER
不知所云。
代码: 全选
$ echo A Tag Tag Tag | sed 's/.*\(A.*T\).*/\1/g'
A Tag Tag T
好像你的代码跟我一样吧
-
alinmn
- 帖子: 185
- 注册时间: 2006-05-19 21:42
- 来自: NIT
#12
帖子
由 alinmn » 2007-05-11 13:54
csbde 写了:不知道为什么你们要去限定T,贪婪模式足以
sed 's/.*\(A.*T\).*/\1/g'
OVER
回帖没看帖吧