Следующие принципы основаны на одной и той же идее: сохраните номера версий и сборок, затем напечатайте их в конце ввода.
Когда дело доходит до хранилища, у sed есть пространство шаблонов, которое начинается сзначение текущей строки и пробел, который можно использовать для сохранения значений в течение всего процесса.Версия должна быть предварительно добавлена к значению в области удержания, что может быть достигнуто путем добавления пространства удержания к пространству образца с помощью G
.Сборка должна быть добавлена к пространству удержания, что можно сделать с помощью H
.Чтобы удалить новую строку, которую создает H
, пространство удержания перемещается обратно в пространство образца.В обоих случаях новая строка, созданная G
и H
, удаляется с помощью s///
, затем возвращается в область удержания с помощью h
.Конец ввода обозначается адресом $
, по которому пространство удержания перемещается обратно в пространство шаблона и печатается.Короче, чтобы увидеть:
sed -n -e '/^version.*=/ {s/[^=]*=//; G; s/\n//; h; } ' \
-e '/^build.*=/ { s/[^=]*=//; H; g; s/\n/./; h; } ' \
-e '$ { g; P; }'
Это создает новую строку в конце строки, но, надеюсь, это не будет проблемой.
Утилита семейства awk поддерживает переменные, делаязадача более простая.У них есть специальные переменные OFS, разделитель выходного поля и ORS, разделитель выходной записи.print
в awk выводит OFS между каждым аргументом и ORS в конце.Специальный шаблон END
совпадает после окончания ввода.
awk -v OFS=. -v ORS='' \
'/^version.*=/ {sub(/^[^=]*=/, ""); version=$0;} \
/^build.*=/ {sub(/^[^=]*=/, ""); build=$0;} \
END {print version, build;}'
Если вас не волнует конечная точка, и вы можете быть уверены в порядке версии и строк сборки в make-файле:
awk -v ORS=. '/(version|build).*=/ { sub(/^[^=]*=/, ""); print; } '
Продолжение вверх по выразительности языка - perl.* Perl END
имеет функцию, аналогичную awk, отмечая блок для запуска в конце процесса.Хеш может использоваться для хранения частей полного номера версии, позволяя линиям совпадать и хранить версию и сборку в одну строку.
perl -n -e '$ver{$1} = $2 if /^(version|build)[^=]*=(.*)/; \
END {$,="."; print @ver{"version","build"}};'
При использовании sed делает интереснымВ упражнениях ценность упражнений состоит в том, чтобы укреплять себя, выполняя их.Если вам нужно обратиться к другим, лучше не сосредотачиваться на том, как вы пытаетесь решить проблему , а вместо этого искать рекомендуемые подходы.Вы узнаете больше.