Вы также должны подумать о случае, когда нет совпадающих разделителей. Вы хотите вывести строку или нет. Мои примеры здесь ничего не выводят, если совпадений нет.
Вам нужен префикс до 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 в / перед 1-м разделителем. Удалить до первого \ n. Если был добавлен \ n, перейдите в конец и напечатайте.
Если есть начальные и конечные разделители, просто удалить конечные разделители, пока вы не дойдете до элемента nth-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'
person
Markus Linnala
schedule
11.06.2021
sed -E 's...
. Тем не менее, ни один упорный оператор. - person Ondra Žižka   schedule 03.05.2018cut -d'/' -f1-3
. - person Petr Javorik   schedule 17.10.2019