В вашем регулярном выражении ([^.]*\).*
, (
, который фактически равен \(
, является началом захвата группы , а затем [^.]*
захватывает каждый символ, кроме буквальной точки, а *
означает нольили более, тогда \)
- это отметка закрытия группы , которую мы начали, затем .*
захватывает все, что осталось после захвата group1 .
Аналогично будетобъяснение для \(.*\)-.*
regex, где \(.*\)
будет жадно захватывать все в захвате group , но остановится на последнем дефисе -
, а затем будет соответствовать дефису, а далее .*
будет соответствовать оставшемуся тексту.1022 *
Чтобы объяснить на примере, давайте возьмем youtube_dl-2018.12.03
.
Здесь \([^.]*\)
будет захватывать все до точки, следовательно, он будет захватывать youtube_dl-2018
, а затем оставшиеся .*
будут захватывать .12.03
.Затем он будет заменен на \1
, что означает, что youtube_dl-2018
будет передано следующему регулярному выражению -e 's/\(.*\)-.*/\1/'
.
Затем во втором регулярном выражении \(.*\)-.*
, \(.*\)
захватит youtube_dl
ивведите group1 , потому что после этого есть дефис и .*
захватит оставшийся текст, который является 2018
.И так как он заменен на \1
, следовательно, окончательный текст станет youtube_dl
.
Видя ваши данные, я полагаю, вы также можете упростить вашу команду до этого, так как ваш первый регулярное выражение в команде sed
кажетсяизлишний.Попробуйте эту следующую команду и посмотрите, выводит ли она тот же результат?
pkg info | sed -e 's/\(.*\)-.*/\1/'
Вы можете использовать только эту упрощенную команду, поскольку ни один из ваших данных не содержит .
перед -
, в противном случае вам следует использоватьсобственная команда, которая имеет два sed
правила.
Также, на другой ноте, если вы используете -r
, (или -E для OS X ),для расширенного регулярного выражения вам не нужно избегать скобок, и вы можете записать свое регулярное выражение как
pkg info | sed -r 's/([^.]*).*/\1/' -r 's/(.*)-.*/\1/'