2011-02-09 11 views

答えて

3

分割統治:

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

+1:Cool!この種の問題でこのトリックを覚えています。ありがとうございました! –

-1

更新2:あなたはこれを試しましたか?

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

UPDATE:のみTOKENの最初のoccuranceのため

s/.*?TOKEN// 

.*?試合:申し訳ありませんが、非欲張りマッチがSED

でサポートされていない、これを試してみてください。

+0

私の悪い、それを – aorcsik

2

sedの代わりにperlを使用できますか?

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


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

Sedは貪欲でない一致をサポートしていません。 Perlはそうです。

+0

+1を修正:ありがとうございます!知っておいて、それは "非貪欲なマッチング"と呼ばれています。 –

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

OPの例では動作しますが、一般的な問題ではありません。タイトル "regexpを使用して最初のトークンまで部分文字列を削除してください" - 前のトークンではなく最後のトークンまで削除します。 – eumiro

+0

@eumiro:* shrug *「文字列に2つの部分文字列がある」と言われています。 –

+0

+1:これは私がこれを考慮しなかったのは恥ずかしいものです:-)実際に私の特別なケースではうまくいくでしょう!ありがとう! –

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

私はWindows環境を持っています。基本的なcygwin/mingwツールへのツールの使用を最小限に抑えたいと思っていました。 –

+0

文字列の「ガベージ」部分にスラッシュが含まれているので、どちらのテクニックもこの場合は機能しません。 –

0

ありがとうございます、私は何か新しいことを学びました。 最後に、私はgrepを使用し

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

-oはgrepを使用して、私の目標を達成することができました:

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

文字列の「ガベージ」部分にスラッシュが含まれているので、どちらのテクニックもこの場合は機能しません。 –

+0

あなたは正しいです、それは私の部分に少しスペースがありました。それは次のようにする必要があります: 'echo $ word | grep -o '/ TOKEN。*' ' – mohit6up

関連する問題