0

文字列「r1/pkg / amd64 / misc / hash / hash-r1.r5218.tbz」がありますが、「hash-r1.r5218.tbz」のみが必要です。

だから、これを試してみます

 unix$ a="r1/pkg/amd64/misc/hash/hash-r1.r5218.tbz"
 unix$ echo $a | sed 's/.*\/\([^\/]*\)\.tbz/\1/'  //[1]
 hash-r1.r5218   //I know this should work

 unix$ echo $a | sed 's/.*\/\([^\/]+\)\.tbz/\1/'  //[2]
 r1/pkg/amd64/misc/hash/hash-r1.r5218.tbz    //however I do not know why it does not work.

私が覚えている限り、正規表現の+は、前の正規表現を1回以上使用することを意味します。* regexpで、前のregexpを0回以上使用することを意味します。

[2]が失敗する理由を誰かが説明できますか、どうもありがとう。

4

3 に答える 3

2
a="r1/pkg/amd64/misc/hash/hash-r1.r5218.tbz"
echo $a | sed 's:.*/::; s:.tbz$::'
hash-r1.r5218

パターン/replマーカーとして「/」を使用する必要はありません。他の文字を使用できます。':'は非常に人気があります。

また、ターゲットデータの両側の正確なテキストがわかっている場合は、キャプチャバッファを使用する必要はありません。

最後の「/」までのすべての文字を置き換えて、すべての文字を信頼し.*、「/」を使用してsedの標準的な欲張り検索を終了しました。あなたは注意してトレーリング\.tbzをサブアウトします。

IHTH。

于 2012-11-01T18:52:23.793 に答える
1

正規表現でsedサポートされているすべてのバージョンではありません。+それをサポートするものは指定する必要-rがあります。しかし、なぜまたはsedの代わりに使用するのですbasenameecho ${a##*/}

于 2012-11-01T21:39:21.330 に答える
0

括弧を介してこのサブマッチを使用すると、最後のスラッシュから行末までのすべてが取得されます。

str="r1/pkg/amd64/misc/hash/hash-r1.r5218.tbz"
echo $str | sed -n -E -e 's/.+\/(.+)$/\1/p'

hash-r1.r5218.tbzを返します

ああ、そしてsedはデフォルトで一致する各行を出力するため、#2は失敗します。-nフラグを使用すると、それが抑制され、この正規表現の末尾の「p」は、置換の置換部分を出力します。

于 2012-11-01T19:02:28.427 に答える