我有路径:
GarbageContainingSlashesAndDots / TOKEN / XYZ / TOKEN / ABC
我如何删除GarbageContainingSlashesAndDots?
我知道,它在TOKEN之前,但不幸的是,字符串中有两个子字符串TOKEN。
使用sed s/.*TOKEN//
将我的字符串设为 / abc ,
但我需要 / TOKEN / xyz / TOKEN / abc
谢谢!!!
答案 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
的第一次出现。