2011-03-03 102 views
7

我有一個正則表達式,我需要驗證。正則表達式中有雙引號,但我似乎無法弄清楚如何正確地轉義它們。Bash正則表達式條件

第一次嘗試不起作用,因爲引號沒有被轉義。

while read line 
do 
    if [[ $line =~ "<a href="(.+)">HTTP</a>" ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {"link.html"} (with double quotes) 

我怎樣才能正確運行此所以輸出link.html沒有雙引號。

我已經試過......

while read line 
do 
    if [[ $line =~ "<a href=/"(.+)/">HTTP</a>" ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {} 

沒有運氣。有人可以幫助我,這樣我就可以停止在我的桌子上打我的頭了嗎?我對Bash不太滿意。謝謝!

+0

你試過''\\,在世界各地regognized其現在通用轉義字符。 – sln 2011-03-03 20:50:35

回答

9

最好把你的正則表達式放在一個變量中。

pattern='<a href="(.+)">HTTP</a>' 
while read line 
do 
    if [[ $line =~ $pattern ]]; then 
    SOURCE=${BASH_REMATCH[1]} 
    break 
    fi 
done < tmp/source.html 

echo "{$SOURCE}" #output = {link.html} (without double quotes) 
+2

太棒了,工作正常!謝謝! – jayem 2011-03-03 22:39:54

+0

謝謝,想知道將它放入一個變量並將它直接寫入'[[$ line =〜pattern]]塊之間有什麼區別? – chw21 2016-08-17 05:48:12

+1

@ chw21:引用模式以允許其中的空格等字符導致該模式被視爲一個簡單的字符串而不是正則表達式,並且該匹配等同於'=='而不是'=〜'。在變量賦值中進行引用和轉義更容易,也更簡單。 – 2016-08-17 15:47:17

2
$line =~ "<a href=\"(.+)\">HTTP</a>" 
+0

謝謝,但它沒有奏效。 – jayem 2011-03-03 20:55:44

0

試試這個"<a href="""(.+)""">HTTP</a>"

編輯,以及試試這個

"<a href="\""(.+)"\"">HTTP</a>"

'<a href="(.+)">HTTP</a>'

'<a href='\"'(.+)'\"'>HTTP</a>' < - 這將給Bash中正確的語法,作爲正則表達式(+),不知道怎麼會玩

編輯,你得到了什麼,當你使用這個表達式"<a href=(.+)>HTTP</a>"

+0

輸出仍然是{「link.html」} – jayem 2011-03-03 20:56:47

+0

所有這三個輸出都是{} – jayem 2011-03-03 21:16:50

1

我建議總是指定正則表達式時使用的變量:

#!/bin/bash 

SOURCE= 
url_re='<a href="(.+)">HTTP</a>' 
while read line 
do 
    if [[ "$line" =~ $url_re ]]; then 
     SOURCE=${BASH_REMATCH[1]} 
     break 
    fi 
done < test.txt 

echo $SOURCE # http://example.com/ 

# test.txt contents: 
# <a href="http://example.com/">HTTP</a>