无法使用sed -n'/.../p'捕获部分行

时间:2013-08-22 14:01:26

标签: bash sed

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

3 个答案:

答案 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'