【问题标题】:Regular expression in awk in bash shell scriptbash shell脚本中awk中的正则表达式
【发布时间】:2015-12-09 09:11:17
【问题描述】:

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

#!/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中。

【问题讨论】:

    标签: regex bash shell awk


    【解决方案1】:
    • 你需要将你的shell变量$line传递给awk,否则它不能在脚本中使用。
    • 或者,您可以只使用 awk 读取文件(根本不需要 sed)。
    • 如果要匹配 . 以及数字,则必须将其添加到正则表达式中。

    试试这样的:

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

    【讨论】:

      【解决方案2】:

      三件事:

      您需要将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
      

      【讨论】:

        猜你喜欢
        • 2013-06-06
        • 2012-01-25
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 2015-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多