sed模式匹配两个字符串之间;第二模式失败

时间:2018-06-29 11:02:31

标签: regex sed

我试图提取两个字符串之间的模式。在下面的示例中,我希望我的输出仅为“ mydata.data”:

> echo "this/cluster/data/mydata.data?x-username=me" | sed 's/.*data\/\(.*\)?x/\1/'
> mydata.data-username=me

我该怎么做才能不输出第二个匹配项之后的字符串(“ -username = me”)?

谢谢!

2 个答案:

答案 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将替换行的其余部分。

右半部分替换与左半部分匹配的所有内容,因此您的模式必须与您要替换的所有内容匹配。