извлечь значение из нескольких строк, используя sed - PullRequest
4 голосов
/ 25 ноября 2010

Я всего n00b, когда дело доходит до использования sed, и не могу понять это ...

У меня есть следующие данные, выводимые инструментом командной строки:

ruby:
interpreter:  "ruby"
version:      "1.8.6"
date:         "2010-02-04"
platform:     "i386-mingw32"
patchlevel:   "398"
full_version: "ruby 1.8.6 (2010-02-04 patchlevel 398) [i386-mingw32]"

homes:
gem:          ""
ruby:         "C:\ruby\ruby-1.8.6-p398-i386-mingw32"

binaries:
ruby:         "C:\ruby\ruby-1.8.6-p398-i386-mingw32\bin"
irb:          "C:\ruby\ruby-1.8.6-p398-i386-mingw32\bin\irb.bat"
gem:          "C:\ruby\ruby-1.8.6-p398-i386-mingw32\bin\gem.bat"
rake:         ""

environment:
GEM_HOME:     ""
HOME:         "c:/Users/derick"
IRBRC:        ""
RUBYOPT:      ""

file associations:
.rb:
.rbw:

Я хочу использовать sed, чтобы извлечь значения только из interpreter и version и вернуть их как "версию-интерпретатор".

Лучшее, что я мог придумать, это использовать grep для возврата всей строки версии:

pik info | grep -e '^version:.*'

, но это возвращает слишком много информации из версиии не включает интерпретатор (очевидно).

Как я могу использовать sed для извлечения только тех битов информации, которые мне нужны, чтобы я получил результат ruby-1.8.6?

... или grep, или awk, или любой другой инструмент командной строки, чтобы получить необходимую информацию ...

FWIW: я не использую RVM, потому что это машина Windows, использующая MinGW32... я использую Pik, который похож на RVM, но сделан для Windows.

Ответы [ 7 ]

4 голосов
/ 26 ноября 2010

Многие из вас прилагают все усилия, чтобы разобраться с цитатами. Пусть awk сделает это:

pik info | awk -F '"' '
    /^interpreter:/ {interp = $2} 
    /^version:/     {ver = $2}
    interp && ver   {print interp "-" ver; exit}
'
3 голосов
/ 25 ноября 2010

Это достаточно просто сделать в чистом «sed», если вы знаете «пространство для удержания»:

sed -n '/^interpreter: *"\(.*\)"/{
s//\1/
h
}
/^version: *"\(.*\)"/{
s// \1/
H
x
s/\n//
s/.*/interpreter-version: "&"/p
}'

В целом сценарий ничего не печатает (-n), если только выприкажи это.Первый искомый шаблон - это строка интерпретатора;мы фиксируем имя переводчика, затем удаляем весь остальной материал и копируем имя переводчика (плюс символ новой строки) в область удержания ('h').Второй искомый шаблон - строка версии.Подобным образом мы выделяем только номер версии - ставим перед ним пробел.Затем мы объединяем номер версии с пробелом удержания ('H') и меняем местами пробел удержания и образца ('x').Мы удаляем новую строку между именем переводчика и номером версии;затем поставьте перед ним префикс «interpreter-version: "», а затем заключите его в двойную кавычку и напечатайте результат:

interpreter-version: "ruby 1.8.6"

И если вы действительно хотите «ruby-1.8.6», тогда изменениянесовершеннолетний:

sed -n '/^interpreter: *"\(.*\)"/{
s//\1/
h
}
/^version: *"\(.*\)"/{
s//-\1/
H
x
s/\n//p
}'

Это префикс версии с дефисом вместо пробела, а затем необходимо только удалить символ новой строки перед печатью после замены пробелов и пробелов.

3 голосов
/ 25 ноября 2010

Будет ли полезна работа со строкой 'full_version'?

pik info | awk '/full_version/ {print $2,$3}' | sed 's/\"//;s/\s/\-/'

Я уверен, что бит sed можно свернуть в бит awk с помощью sub (), но я оставлю егокому-то более сведущему в awk.

2 голосов
/ 25 ноября 2010

1) захватить в файл то, что выводится вашим инструментом командной строки, то есть что-то >> outfile 2) на моем bash / ubuntu box "

grep -e "interpreter" -e "version" outfile | awk 'BEGIN {print"Interpreter-Version" }{print $2}'| sed 's/"//g'| tr '\n' ' '

3) Выход:

Interpreter-Version ruby 1.8.6

Я уверен, что это можно оптимизировать, но у меня это сработало: -)

НТН,

Крис.

1 голос
/ 26 ноября 2010

Использование только sed:

pik info | sed -n '/^full_version: "\([^(]*\)(.*/ {s//\1/; s/ /-/;p}'
1 голос
/ 25 ноября 2010

Версия с использованием awk и sed.

pik info | awk '/^interpreter:|^version:/ {printf "%s-", $2}' | sed -e 's/"//g' -e 's/-$//'
1 голос
/ 25 ноября 2010

Это должно помочь:

pik info | awk '/^interpreter:/ {inter=$2; gsub(/"/, "", inter)} /^version:/ {vers=$2; gsub(/"/, "", vers)} END {print inter "-" vers}'

генерирует ...

ruby-1.8.6
...