2016-10-10 1 views
0

Так вот мой код:Regex работает должным образом в карете Regex, но при нанесении на баш, не больше

if [[ $line =~ [A-z]{3}\s[A-z]{3}\s[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\sIST\s[0-9]{4} ]] 
then 
    echo "hello" 
fi 

Вот текстовый файл:

<table width="100%" border=1 align="center">^M 
<tr><th width="10%">Serial No.</th><th width="20%">File/Folder Name</th><th width="40%">Modified Date.</th><th width="10%">Size</th><th width="20%">Open/Download</th></tr>^M 
<h4>Folder : "Nifty Free Float Smallcap 100"</h4><br> 
<tr><td width="10%">1</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_031016.zip">Nifty_Free_Float_Smallcap_100_031016.zip</a></td><td width="40%">Mon Oct 03 16:41:33 IST 2016</td><t</td></tr><tr><td width="10%">2</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_041016.zip">Nifty_Free_Float_Smallcap_100_041016.zip</a></td><td width="40%">Tue Oct 04 16:43:20 IST 2 
</td></tr><tr><td width="10%">3</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_051016.zip">Nifty_Free_Float_Smallcap_100_051016.zip</a></td><td width="40%">Wed Oct 05 17:39:48 IST 2</td></tr><tr><td width="10%">4</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_061016.zip">Nifty_Free_Float_Smallcap_100_061016.zip</a></td><td width="40%">Thu Oct 06 16:40:29 IST 2 
</td></tr><tr><td width="10%">5</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_071016.zip">Nifty_Free_Float_Smallcap_100_071016.zip</a></td><td width="40%">Fri Oct 07 16:46:10 IST 2 
</td></tr>^M 
</table> 

Он работает в regex code, но когда я запускаю это в bash, он больше не работает. Любое предложение очень ценится. спасибо :)

+1

Разбор HTML с помощью BASH регулярное выражение может быть очень подвержен ошибкам. '[A-z]' в любом случае не так. Это должно быть '[A-Za-z]' – anubhava

+0

Поддерживает ли ваша BASH '\ s'? Вместо этого используйте '[[: space:]]'. Кроме того, '[[: alpha:]]' является более точным выражением для соответствия только букв. –

ответ

0

При попытке отладки регулярного выражения полезно начинать с меньших фрагментов выражения, создавая его, когда вы идете, чтобы убедиться, что вы написали его правильно.

т.е. Старт с [A-Za-z]{3} затем [A-Za-z]{3}\s затем [A-Za-z]{3}\s[A-Za-z]{3} ... и т.д.

Debugging таким образом, я заметил, что [A-z] должен быть [A-Za-z], как анубхава предлагает, и что вам не хватает дополнительного [0-9]{2} захватить день месяц. Так как вы пытаетесь соответствовать 4-значный год, будет только одна строка соответствия:

#!/bin/bash 

#  Wed   Oct  12  12 : 34 : 56  IST 2016 
re='([A-Za-z]{3}\s[A-Za-z]{3}\s[0-9]{2}\s[0-9]{2}:[0-9]{2}:[0-9]{2}\sIST\s[0-9]{4})' 

# Iterate over each line 
cat input.html | while read line; do 
    if [[ $line =~ $re ]] 
    then 
     echo "$line" 
     echo "==> ${BASH_REMATCH[1]}" 
    fi 
done 

Выход

<tr><td width="10%">1</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_031016.zip">Nifty_Free_Float_Smallcap_100_031016.zip</a></td><td width="40%">Mon Oct 03 16:41:33 IST 2016</td><t</td></tr><tr><td width="10%">2</td><td width="20%"><a href="Download?path=Nifty Free Float Smallcap 100/Nifty_Free_Float_Smallcap_100_041016.zip">Nifty_Free_Float_Smallcap_100_041016.zip</a></td><td width="40%">Tue Oct 04 16:43:20 IST 2 
==> Mon Oct 03 16:41:33 IST 2016