提取$和<之间的值使用sed或替代函数的文本行

时间:2016-10-11 16:41:39

标签: linux bash sed grep

我试图从这一行中提取价格:

<div class="bpi-value bpiUSD">$634.17</div>

我想输出:

634.17

我试过了:

sed -n "/$/,/</p"

希望提取$<之间的所有内容,但它不起作用。我认为造成这种情况的原因可能是美元符号被解释为变量或其他东西。这样做的最佳方式是什么?

3 个答案:

答案 0 :(得分:3)

从标记语言中提取内容的正确方法是使用语法感知工具:

read -r var < <(xmlstarlet sel -t -m '//div[@class="bpi-value bpiUSD"]' -v . <in.xhtml)
var=${var#'$'} # strip leading $

但是,如果必须,并且您只处理一行,请使用bash的原生built-in string manipulation primitives,而不是为sed等外部工具支付启动费用:

line='<div class="bpi-value bpiUSD">$634.17</div>'
var=${line#*$}   # delete everything up and including to first $
var=${var%%'<'*} # delete everything after the first remaining <

另见:

答案 1 :(得分:1)

sed处理正则表达式,'$'表示“行尾”。最短的sed线将起作用(假设你的线路表现良好)

$ echo '<div class="bpi-value bpiUSD">$634.17</div>' | sed 's/.*\$\(.*\)<.*/\1/'
634.17

答案 2 :(得分:0)

我同意Biffen。但是,如果您的行是固定格式的,

sed 's/^[^$]\+\(\$[0-9.]\{1,\}\).*$/\1/' <input filename>

应该这样做。它会跳至$(sed中的\$),保持$后跟数字或句点(\(\$[0-9.]\{1,\}\)),然后清除到最后。在bash中对GNU sed 4.2.2进行了测试。

已修复)此答案的第一个版本没有足够的反斜杠。