使用sed从多行中提取引用值

时间:2010-11-25 16:27:37

标签: bash command-line sed awk grep

在使用sed时,我总计n00b,并且无法解决这个问题......

我通过命令行工具输出以下数据:

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仅从interpreterversion中提取值,并将它们作为“interpreter-version”返回。

到目前为止,我能想到的最好的方法是使用grep返回整个版本行:

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

但是从版本行返回太多信息,并且不包括解释器(显然)。

如何使用sed仅提取我想要的信息位,以便得到ruby-1.8.6的结果?

...或grep,或awk,或任何其他命令行工具,以获取我想要的信息......

FWIW:我没有使用RVM,因为这是一台使用MinGW32的Windows机器...我正在使用Pik,它类似于RVM,但是用于Windows。

7 个答案:

答案 0 :(得分:4)

很多人都在努力处理报价。让awk这样做:

pik info | awk -F '"' '
    /^interpreter:/ {interp = $2} 
    /^version:/     {ver = $2}
    interp && ver   {print interp "-" ver; exit}
'

答案 1 :(得分:3)

使用'full_version'字符串会有用吗?

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

我确定sed位可以用'sub()'折叠到awk位,但我会把它留给更精通awk的人。

答案 2 :(得分:3)

如果您知道'保留空间',那么在纯'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 :(得分:2)

1)捕获到命令行工具输出的文件,即>> OUTFILE 2)在我的bash / ubuntu框中“

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

我确信它可以优化,但它对我有用: - )

HTH,

克里斯。

答案 4 :(得分:1)

这应该可以解决问题:

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

生成......

ruby-1.8.6

答案 5 :(得分:1)

同时使用awksed

的版本
pik info | awk '/^interpreter:|^version:/ {printf "%s-", $2}' | sed -e 's/"//g' -e 's/-$//'

答案 6 :(得分:1)

仅使用sed

pik info | sed -n '/^full_version: "\([^(]*\)(.*/ {s//\1/; s/ /-/;p}'