我有路徑:刪除子,直到第一個標記的正則表達式
GarbageContainingSlashesAndDots/TOKEN/XYZ/TOKEN/ABC
如何coukt刪除GarbageContainingSlashesAndDots? 我知道,它是在TOKEN之前,但不幸的是,在字符串中有兩個子字符串TOKEN。 使用sed s/.*TOKEN//
讓我的字符串/ABC, 但我需要/TOKEN/XYZ/TOKEN/ABC 謝謝!
我有路徑:刪除子,直到第一個標記的正則表達式
GarbageContainingSlashesAndDots/TOKEN/XYZ/TOKEN/ABC
如何coukt刪除GarbageContainingSlashesAndDots? 我知道,它是在TOKEN之前,但不幸的是,在字符串中有兩個子字符串TOKEN。 使用sed s/.*TOKEN//
讓我的字符串/ABC, 但我需要/TOKEN/XYZ/TOKEN/ABC 謝謝!
分而治之:
$ echo 'Garbage.Containing/Slashes/And.Dots/TOKEN/xyz/TOKEN/abc' |
sed -n 's|/TOKEN/|\n&|;s/.*\n//;p'
/TOKEN/xyz/TOKEN/abc
UPDATE 2:你試過嗎?
s!.*\(/TOKEN.+TOKEN.*\)!\1!
UPDATE:只爲TOKEN
第一次出現
s/.*?TOKEN//
.*?
比賽:對不起,非貪婪匹配不被sed的
支持試試這個。
是否允許perl而不是sed?
perl -pe 's!.*?(?=/TOKEN)!!'
echo 'GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc' | perl -pe 's!.*?(?=/TOKEN)!!'
# returns:
/TOKEN/xyz/TOKEN/abc
Sed不支持非貪婪匹配。 Perl會。
+1:謝謝!有趣的是,它被稱爲「非貪婪匹配」。 – 2011-02-09 13:33:57
echo "./a//...b/TOKEN/abc/TOKEN/xyz"|sed 's#.*\(/TOKEN/.*/TOKEN/.*\)#\1#'
適用於OP的示例,但不適用於標題爲「使用正則表達式刪除子串直到第一個令牌」的標題中的一般問題 - 您將其移除到最後一個,而不是第一個令牌。 – eumiro 2011-02-09 13:19:16
@eumiro:*聳肩*據說有「字符串TOKEN的兩個子串」。 – 2011-02-09 13:30:07
+1:真遺憾,我沒有考慮過這個:-)它確實適用於我的特殊情況!謝謝! – 2011-02-09 13:55:26
我覺得你有bash的,所以它可以是一個簡單的
$ s="GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc"
$ echo ${s#*/}
TOKEN/xyz/TOKEN/abc
,或者如果你有紅寶石(1.9+)
echo $s | ruby -e 'print gets.split("/",2)[-1]'
謝謝你的所有建議,我學到了一些新東西。 最後,我竟然可以達到用grep我的目標-o
echo "GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc" | grep -o "/TOKEN/.*/TOKEN/.*"
使用grep
:
word='GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc'
echo $word | grep -o '/.*'
我的壞,糾正它 – aorcsik 2011-02-09 13:17:49