我试图提取两个字符串之间的模式。在下面的示例中,我希望我的输出仅为“ mydata.data”:
> echo "this/cluster/data/mydata.data?x-username=me" | sed 's/.*data\/\(.*\)?x/\1/'
> mydata.data-username=me
我该怎么做才能不输出第二个匹配项之后的字符串(“ -username = me”)?
谢谢!
答案 0 :(得分:1)
您可以在模式末尾添加.*
,以消耗掉该行的所有其余部分。另外,如果模式中有/
,建议使用/
以外的定界符。
使用
echo "this/cluster/data/mydata.data?x-username=me" | sed 's,.*data/\(.*\)?x.*,\1,'
请参见online demo
模式将匹配
.*
-任意0个以上的字符data/
-直译为\(.*\)
-将0个以上的字符捕获到第1组(\1
)?x
-匹配?x
文字子串.*
-输入的其余部分不超过0个字符。答案 1 :(得分:0)
您的模式与该行的其余部分不匹配,因此可以通过。将?x更改为?x。*,\ 1将替换行的其余部分。
右半部分替换与左半部分匹配的所有内容,因此您的模式必须与您要替换的所有内容匹配。