SED: как вытащить строку версии

2260
WilliamKF

Я хотел бы использовать sed, чтобы вытащить номер версии из команды:

svnversion --version 

Который дает вывод как:

svnversion, version 1.6.2 (r37639) compiled May 10 2009, 12:41:21  Copyright (C) 2000-2009 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet (http://www.Collab.Net/). 

И после обработки с помощью sed я бы просто хотел:

1.6.2 

Пока что у меня есть это чудовище (из-за моего невежества):

svnversion --version | sed s/[\wa-zA-Z//\(\):,]*//g | sed 's/[ ]//' | sed 's/[ ]//' | sed 's/[ ][0-9 ./n/-]*//' 

Я уверен, что есть простое элегантное решение, которое специалист может легко предоставить.

2

3 ответа на вопрос

5
Darren Hall

Я знаю, что это не использует sed, но на основе ваших выводов это проще.

svnversion --version | head -1 | awk '' 

Если у вас есть Perl ...

svnversion --version | perl -lne 'print $1 if /version (\d+.\d+.\d+)/' 
Да: командные строки UNIX все об использовании правильного инструмента для работы. Shannon Nelson 14 лет назад 0
4
Dennis Williamson

Попробуй это:

svnversion --version | sed -n '/version/ s/.*version \([0-9]\+\.[0-9]\+\.[0-9]\+\) .*/\1/p' 

Это говорит:

  • -n --- Не печатать автоматически вывод.
  • /version/ --- в строках, которые содержат строку «версия»,
  • s/- заменить то, что
  • .*versionи .* --- между [последовательность нулей или более любого символа, строка «версия», пробел] и [пробел, последовательность нуля или более любого символа],
  • \(...\) --- захват
  • [0-9]\+ --- последовательность из одной или нескольких цифр
  • \. --- с последующим буквальным периодом
  • затем больше цифр и точек,
  • /\1/ --- что было зафиксировано в первом (и единственном, в данном случае) наборе скобок
  • p --- и явно распечатать его.

Поскольку автоматическая печать подавляется, и выбирается только строка, содержащая «версию», остальные строки игнорируются.

1
yanchenko

Еще один способ сделать это без sed: svnversion --version | head -1 | cut -d" " -f3