我正在決議HTTP GET請求的輸出sed以檢索給定 html 標記的內容。該請求的結果是這樣的:
"<!DOCTYPE html><html><body><h1>Hello!</h1><p>v1.0.4-b</p></body></html>"
我想檢索 p 元素內的版本號。
但是,sed似乎在正則運算式決議中有一個錯誤。當我使用:
sed 's/.*<p>//'
它正確地替換了版本左側的文本(即,它輸出"v1.0.4-b</p></body></html>")。但是,當我嘗試使用正則運算式組時,
sed 's/.*<p>(.*)<\/p>.*/\1/'
它無法匹配并給出錯誤:
sed: -e expression #1, char 20: invalid reference \1 on `s' command's RHS.
盡管如此,當我在在線正則運算式驗證器上測驗正則運算式時,它仍然有效。
先感謝您
uj5u.com熱心網友回復:
你需要使用
sed -n 's~.*<p>\([^<]*\)</p>.*~\1~p'
sed -n -E 's~.*<p>([^<]*)</p>.*~\1~p'
查看在線演示:
#!/bin/bash
sed -n 's~.*<p>\([^<]*\)</p>.*~\1~p' <<< \
"<!DOCTYPE html><html><body><h1>Hello!</h1><p>v1.0.4-b</p></body></html>"
## => v1.0.4-b
該sed 's/.*<p>(.*)<\p>.*/\1/'命令不起作用,因為
- 您正在使用 POSIX BRE 模式,其中未轉義
(并被)視為文字括號字符,而不是捕獲組。在 POSIX BRE 中,您需要\(...\)定義一個捕獲組(這就是您得到invalid reference \1例外的原因) - 如果您添加
-E啟用 POSIX ERE 的選項,您可以使用它(...)來定義捕獲組 - 你不匹配
/p,你\p在模式中。
由于模式中有斜線,因此選擇除 之外的正則運算式分隔符更方便/,我~在這里選擇了。
此外,我使用-n選項來抑制默認行輸出并p標記僅列印替換的結果。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/432365.html
