我正在使用sed将字符串存储在变量中。我想在文本文件中挑选一行的一部分,但我无法这样做。
例如,如果我要从中提取文本的文本行是:
{foo bar 1.1.2} foo
我想提取bar 1.1.2
我的命令如下:
BarVersion=$(sed -n "/bar [.0-9]/p" file.txt)
但是,如果我写:
echo $BarVersion
我发现sed命令已经在BarVersion中保存了整行,而不仅仅是我想要的部分。即我得到{foo bar 1.1.2} foo
答案 0 :(得分:2)
$ echo '{foo bar 1.1.2} foo' | sed -n 's/^.*\(bar [\.0-9]*\)}.*$/\1/p'
bar 1.1.2
s/x/y/
用x
y
\(\)
组成一个可以通过\1
[\.0-9]*
是任意数量的点.
和数字^
是缓冲区的开头,$
是结束.*
是任意数量的字符答案 1 :(得分:1)
你可以用grep这样做:
BarVersion=$(grep -o "bar [.0-9]*" file.txt)
这似乎对我有用,但当然它不是使用sed,但在我看来它有点简单。
-o
表示只输出匹配行的部分。
答案 2 :(得分:0)
如果您正在运行GNU / something,
sed -nr '/^\{([^ ]*) ([^}]*)\} \1$/ s//\2/p'
如果匹配的'foo'不是必需的,那么
sed -n /^{[^ ]* \([^}]*\)} .*/ s//\1/p'