在使用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仅从interpreter
和version
中提取值,并将它们作为“interpreter-version”返回。
到目前为止,我能想到的最好的方法是使用grep返回整个版本行:
pik info | grep -e '^version:.*'
但是从版本行返回太多信息,并且不包括解释器(显然)。
如何使用sed
仅提取我想要的信息位,以便得到ruby-1.8.6
的结果?
...或grep,或awk,或任何其他命令行工具,以获取我想要的信息......
FWIW:我没有使用RVM,因为这是一台使用MinGW32的Windows机器...我正在使用Pik,它类似于RVM,但是用于Windows。
答案 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)
同时使用awk
和sed
。
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}'