在bash shell脚本中的awk中的正则表达式

时间:2015-12-09 09:11:17

标签: regex bash shell awk

我完全是一个正则表达新手,我认为我的代码问题在于我在awk的匹配函数中使用的正则表达式

#!/bin/bash
...
line=$(sed -n '167p' models.html)
echo "line: $line"
cc=$(awk -v regex="[0-9]" 'BEGIN { match(line, regex); pattern_match=substr(line, RSTART, RLENGTH+1); print pattern_match}')
echo "cc: $cc"

结果是:

line:  <td><center>0.97</center></td>
cc: 

实际上,我想将数值0.97提取到变量cc。

2 个答案:

答案 0 :(得分:2)

  • 您需要将shell变量$line传递给awk,否则无法在脚本中使用。
  • 或者,您可以使用awk读取文件(根本不需要涉及sed)。
  • 如果您想匹配.以及数字,则必须将其添加到正则表达式中。

尝试这样的事情:

cc=$(awk 'NR == 167 && match($0, /[0-9.]+/) { print substr($0, RSTART, RLENGTH) }' models.html)

答案 1 :(得分:1)

三件事:

您需要使用line

-v的值传递给awk
awk -v line="$line" ...

您的正则表达式只匹配一个数字。要匹配浮点数,您需要类似

的内容
[0-9]+\.[0-9]+

无需为子串

的匹配长度添加1
substr(line, RSTART, RLENGTH)

全部放在一起:

line='<td><center>0.97</center></td>'
echo "line: $line"
cc=$(awk -v line="$line" -v regex="[0-9]+\.[0-9]+" 'BEGIN { match(line, regex); pattern_match=substr(line, RSTART, RLENGTH); print pattern_match}')
echo "cc: $cc"

结果:

line: <td><center>0.97</center></td>
cc: 0.97