2017-11-11 148 views
0

我試圖解析通過html源代碼。在我的例子中,我只是在迴應它。但是,我正在練習中從文件中讀取html。字段分隔符 - 麻煩分隔命令字符

下面是一些代碼,工程,語法:

echo "<td>Here</td> some dynamic text to ignore <garbage> is a string</table>more junk" | 
awk -v FS="(<td>|</td>|<garbage>|</table>)" '{print $2, $4}' 
在FS聲明

我創建4個分隔符,其做工精細,和我輸出2和第4場。

然而,第三場定界符我真正需要使用包含awk命令字,從字面上:

')"> 

,這樣當我改變上述聲明:

echo "<td>Here</td> some dynamic text to ignore ')\"> is a string</table>more junk" | 
awk -v FS="(<td>|</td>|')\">|</table>)" '{print $2, $4}' 

我試着將冒犯的字符串與\字符的一個,全部和每個組合進行轉義。但是,沒有任何工作。

+0

命令的預期輸出不起作用是什麼? –

+0

@Ed Morton的第一位代碼返回預期的輸出。第二個不是。已經將您的其他答覆標記爲解決方案。謝謝。 – James

+2

確定,但下次 - 實際顯示您的問題的預期輸出。 –

回答

2

這可能是你在找什麼:

$ echo "<td>Here</td> some dynamic text to ignore ')\"> is a string</table>more junk" | 
awk -v FS='(<td>|</td>|\047\\)">|</table>)' '{print $2, $4}' 
Here is a string 

在外殼,始終在單引號的字符串(和命令行腳本),除非你需要使用雙引號來暴露你的字符串內容到殼,例如讓shell擴展一個變量。

每殼的規則,你不能包括分隔字符串'foo'bar'單引號內的單引號,但(沒有反斜槓量將努力逃脫中間串'),所以你需要或者跳回了單引號提供一個單引號然後回來,例如與'foo'\''bar'或使用八進制轉義序列\047(不要使用十六進制等效,因爲它容易出錯),無論你想要一個單引號,例如'foo\047bar'。然後您需要兩次跳過)--一次用於awk將字符串轉換爲正則表達式,然後當awk將它用作正則表達式時。

如果你一直在字符串周圍使用雙引號,當shell解析字符串時需要一個額外的轉義,但當你用單引號括住字符串時不需要這個轉義,因爲這是阻止shell解析字符串。

+1

就是這樣。謝謝。在FS聲明中使用雙引號而不是單引號的組合,以及使用八進制代碼的撇號。謝謝。 – James