sed从字符串中提取一些东西

时间:2012-11-01 18:46:34

标签: unix sed

我有一个字符串“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.

据我记得,+在regexp中,意味着使用之前的正则表达式1次或更多次。 *在regexp中,表示使用之前的正则表达式0次或更多次。

有人能解释为什么[2]会失败,非常感谢。

3 个答案:

答案 0 :(得分:2)

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

您不需要使用'/'作为patern / repl标记,您可以使用其他字符。 ':'很受欢迎。

此外,当您知道目标数据两侧的确切文本时,您不必使用捕获缓冲区。

我已将所有字符替换为最后一个'/',依赖.*表示所有字符,'/'终止标准贪婪搜索sed。你注意到了跟踪\.tbz

IHTH。

答案 1 :(得分:1)

并非所有版本的sed都在正则表达式中支持+。有些人支持它需要指定-r。但为什么要使用sed代替basenameecho ${a##*/}

答案 2 :(得分:0)

通过括号使用此子匹配将抓取最后一个斜杠后的所有内容到你的行尾。

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

返回hash-r1.r5218.tbz

哦,你的#2失败了,因为默认情况下sed打印出每个匹配的行。使用-n标志会抑制该值,并且此正则表达式上的尾随“p”将打印出替换的替换部分。