2015-12-09 56 views
1

我完全是一個正則表達式新手,我認爲我的代碼的問題在於正則表達式我在匹配匹配函數awk。awk中bash shell腳本中的正則表達式

#!/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到可變立方厘米。

回答

1

三件事:

您需要的line值傳遞到AWK與-v

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 
+0

非常感謝你。 – dudu

2
  • 您需要將shell變量$line傳遞給awk,否則無法在腳本中使用它。
  • 或者,您可以使用awk讀取文件(不需要涉及sed)。
  • 如果您想匹配.以及數字,您必須將其添加到正則表達式中。

嘗試這樣:

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