您还应该考虑没有匹配分隔符的情况。您是否要输出该行。如果没有匹配项,我的示例不会输出任何内容。
您需要最多第 3 个 / 的前缀,因此选择两次不包含 / 和跟随 / 的任意长度的字符串,然后选择不包含 / 的任意长度的字符串,然后匹配 / 跟随任何字符串,然后打印选择。这个想法适用于任何单个字符分隔符。
echo http://www.suepearson.co.uk/product/174/71/3816/ | \
sed -nr 's,(([^/]*/){2}[^/]*)/.*,\1,p'
使用 sed 命令,您可以快速删除前缀或选择分隔符,例如:
echo 'aaa @cee: { "foo":" @cee: " }' | \
sed -r 't x;s/ @cee: /\n/;D;:x'
这比一次吃炭要快得多。
如果之前匹配成功,则跳转到标签。在第一个分隔符之前的 / 处添加 \n。最多删除第一个\n。如果添加了 \n,则跳转到结尾并打印。
如果有开始和结束分隔符,很容易删除结束分隔符,直到你到达你想要的第n-2个元素然后做D技巧,在结束分隔符之后删除,如果不匹配则跳转到删除,在开始分隔符之前删除并且和打印。这仅在开始/结束分隔符成对出现时才有效。
echo 'foobar start block #1 end barfoo start block #2 end bazfoo start block #3 end goo start block #4 end faa' | \
sed -r 't x;s/end//;s/end/\n/;D;:x;s/(end).*/\1/;T y;s/.*(start)/\1/;p;:y;d'