0

我正在使用 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

4

3 回答 3

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]*是任意数量的点.和数字
  • ^是缓冲区的开始,$是结束
  • .*是任意数量的字符
于 2013-08-22T14:05:20.090 回答
1

你可以像这样使用 grep 来做到这一点:

BarVersion=$(grep -o "bar [.0-9]*" file.txt)

这似乎对我有用,但当然它不是使用 sed,但在我看来它更简单一些。

-o表示只输出匹配的那部分行。

于 2013-08-22T14:06:41.447 回答
0

如果你正在运行 GNU/其他东西,

sed -nr '/^\{([^ ]*) ([^}]*)\} \1$/ s//\2/p'

如果匹配的 'foo' 不是必需的,它是

sed -n /^{[^ ]* \([^}]*\)} .*/ s//\1/p'
于 2013-08-22T14:35:57.270 回答