[英]Sed regexp multiline - replace HTML
我試圖在Linux系統上使用sed替換多行
這是我的檔案
<!-- PAGE TAG -->
DATA1
DATA2
DATA3
DATA4
DATA5
DATA6
<div id="DATA"></div>
DATA8
DATA9
<!-- PAGE TAG -->
我的嘗試和失敗!
sed -n '1h;1!H;${;g;s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->//g;p;}'
sed -n '1!N; s/<!-- PAGE TAG -->.*<!-- PAGE TAG -->// p'
sed -i 's|<!--[^>]*-->[^+]+<!--[^>]*-->||g'
sed -i 's|/\/\/<!-- PAGE TA -->/,/\/\/<!-- PAGE TA -->||g'
應該替換<!-- PAGE TAG -->
之間的所有內容。
這個問題類似於sed multiline replace
根據您看到的鏈接中給出的答案進行調整,這應該有效:
sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/d'
正則表達式的格式是[2addr]d
,其中2個地址是/<!-- PAGE TAG -->/
和/<!-- PAGE TAG -->/
,用逗號分隔。 d
表示刪除從匹配第一個地址的行到與最后一個地址匹配的行的所有行。 (它表示標記之外的內容,但與標記位於同一行也將被刪除)。
雖然蒂姆波特已經回答了這個問題,但我會在這里發布,以防有人需要更換多線模式:
sed -n '1h; 1!H; ${g; s/<!-- PAGE TAG -->[^!]*<!-- PAGE TAG -->//g; p;}'
這里的正則表達式有點不完整,因為它假設沒有!
2頁標簽之間的數據中的字符。 沒有這個假設,我無法控制正則表達式匹配的字符數,因為沒有惰性量詞(據我所知)。
此解決方案不會刪除標記之前的文本,即使它與標記位於同一行。
雖然@nhahtdh的回答是原始問題的正確答案,但這個解決方案是您的意見的答案:
sed '
/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ {
1 {
s/^.*$/Replace Data/
b
}
d
}
'
您可以這樣閱讀:
/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/
- >這些正則表達式之間的行
1 {
- >表示第一個匹配的行
s/^.*$/Replace Data/
- >搜索任何內容並替換為Replace Data
b
- > branch to end(在這個例子中表現得像break)
d
- >否則,刪除該行
您可以通過在每個命令后添加分號將任何系列的sed命令組合成單行使用gnu sed(但如果您希望以后能夠讀取它,則不建議使用分號):
sed '/<!-- PAGE TAG -->/,/<!-- PAGE TAG -->/ { 1 { s/^.*$/Replace Data/; b; }; d; };'
作為旁注,您應該盡量在發布中盡可能具體。 “替換/刪除”表示“替換或刪除”。 如果你想要它被替換,只需說替換。 這有助於我們這些嘗試回答您問題的人以及可能遇到同樣問題的未來用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.