使用正则表达式删除子串直到第一个令牌

时间:2011-02-09 12:59:12

标签: regex sed

我有路径:

GarbageContainingSlashesAndDots / TOKEN / XYZ / TOKEN / ABC

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

7 个答案:

答案 0 :(得分:3)

分而治之:

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

答案 1 :(得分:2)

是否允许perl而不是sed?

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


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

Sed不支持非贪婪匹配。 Perl确实。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我认为你有bash,所以它可以是一个简单的

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

或者如果你有Ruby(1.9 +)

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

答案 4 :(得分:0)

感谢您提出的所有建议,我已经学到了新的东西。 最后,我能够使用grep -o

达到目标
echo "GarbageContainingSlashesAndDots/TOKEN/xyz/TOKEN/abc" | grep -o "/TOKEN/.*/TOKEN/.*"

答案 5 :(得分:0)

使用grep

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

答案 6 :(得分:-1)

更新2:你试过这个吗?

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

更新:抱歉,sed不支持非贪婪的匹配

试试这个:

s/.*?TOKEN//

.*?仅匹配TOKEN的第一次出现。