2011-02-09 68 views
2

我有路径:删除子,直到第一个标记的正则表达式

GarbageContainingSlashesAndDots/TOKEN/XYZ/TOKEN/ABC

如何coukt删除GarbageContainingSlashesAndDots? 我知道,它是在TOKEN之前,但不幸的是,在字符串中有两个子字符串TOKEN。 使用sed s/.*TOKEN//让我的字符串/ABC, 但我需要/TOKEN/XYZ/TOKEN/ABC 谢谢!

回答

3

分而治之:

$ echo 'Garbage.Containing/Slashes/And.Dots/TOKEN/xyz/TOKEN/abc' | 
     sed -n 's|/TOKEN/|\n&|;s/.*\n//;p' 
/TOKEN/xyz/TOKEN/abc 
-1

UPDATE 2:你试过吗?

s!.*\(/TOKEN.+TOKEN.*\)!\1! 

UPDATE:只为TOKEN第一次出现

s/.*?TOKEN// 

.*?比赛:对不起,非贪婪匹配不被sed的

支持试试这个。

+0

我的坏,纠正它 – aorcsik 2011-02-09 13:17:49

2

是否允许perl而不是sed?

perl -pe 's!.*?(?=/TOKEN)!!' 


echo 'GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc' | perl -pe 's!.*?(?=/TOKEN)!!' 
# returns: 
/TOKEN/xyz/TOKEN/abc 

Sed不支持非贪婪匹配。 Perl会。

+0

+1:谢谢!有趣的是,它被称为“非贪婪匹配”。 – 2011-02-09 13:33:57

0
echo "./a//...b/TOKEN/abc/TOKEN/xyz"|sed 's#.*\(/TOKEN/.*/TOKEN/.*\)#\1#' 
+0

适用于OP的示例,但不适用于标题为“使用正则表达式删除子串直到第一个令牌”的标题中的一般问题 - 您将其移除到最后一个,而不是第一个令牌。 – eumiro 2011-02-09 13:19:16

+0

@eumiro:*耸肩*据说有“字符串TOKEN的两个子串”。 – 2011-02-09 13:30:07

+0

+1:真遗憾,我没有考虑过这个:-)它确实适用于我的特殊情况!谢谢! – 2011-02-09 13:55:26

0

我觉得你有bash的,所以它可以是一个简单的

$ s="GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc" 
$ echo ${s#*/} 
TOKEN/xyz/TOKEN/abc 

,或者如果你有红宝石(1.9+)

echo $s | ruby -e 'print gets.split("/",2)[-1]' 
0

谢谢你的所有建议,我学到了一些新东西。 最后,我竟然可以达到用grep我的目标-o

echo "GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc" | grep -o "/TOKEN/.*/TOKEN/.*" 
0

使用grep

word='GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc' 
echo $word | grep -o '/.*'