2011-02-09 96 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 '/.*' 
相關問題