sed - как создавать регулярные выражения, используя sed

Есть ли в любом случае вы можете сделать группу соответствия регулярному выражению, используя sed, как шаблон регулярного выражения java / match / group?

если у меня есть строка как

test-artifact-201251-balbal-0.1-SNAPSHOT.jar

Как я могу использовать Sed просто, чтобы получить результат, как:

test-artifact-0.1-SNASHOT.jar

Мне интересно, позволяет ли sed делать что-то вроде регулярных выражений Java, вы определяете шаблон следующим образом:

([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)([.]*SNAPSHOT.jar)

и тогда вы можете получить результаты в виде массива, например:

test-artifact-
201251-
balbal-
0.1-SNAPSHOT.jar

4 ответа

Решение

Вы должны избегать скобок для групповых выражений:

\([a-z]*-[a-z]*-\)\([0-9]*-\)\([a-z]*-\)\([.]*SNAPSHOT.jar\)

И использовать их с \1, \2, так далее.


РЕДАКТИРОВАТЬ: Также обратите внимание, прежде чем SNAPSHOT тот [.] не будет соответствовать. Внутренние скобки . буквально. Так должно быть [0-9.-]*

Вот что значат Бирей и Тор:

sed -r "s/([a-z]*-[a-z]*-)([0-9]*-)([a-z]*-)(.*)/\1\n\2\n\3\n\4/"

Выход:

test-artifact-
201251-
balbal-
0.1-SNAPSHOT.jar

На самом деле, awk может спасти вас от группировки.:)

Вы просто даете нужный номер индекса:

awk 'BEGIN{FS=OFS="-"}{print $1,$2,$5,$6}' 

выход:

kent$  echo "test-artifact-201251-balbal-0.1-SNAPSHOT.jar"|awk 'BEGIN{FS="-";OFS="-"}{print $1,$2,$5,$6}'
test-artifact-0.1-SNAPSHOT.jar

Если вы ищете более простой способ, я думаю, это может быть вашей помощью!:)

echo "est-artifact-201251-balbal-0.1-SNAPSHOT.jar" | cut -d- -f1,2,5,6

"-" используется в качестве разделителя, и поля 1,2,5,6 печатаются.

Примечание. Для этого необходимо знать точное положение поля.

Другие вопросы по тегам