我正在嘗試替換任何出現的cwe.mitre.org.*.html(正則運算式)URL 并洗掉.html擴展名而不更改任何其他型別的 URL。
例子:
https://cwe.mitre.org/data/definitions/377.html
http://google.com/404.html
期待:
https://cwe.mitre.org/data/definitions/377
http://google.com/404.html
有沒有辦法在 sed 或其他工具中做到這一點?
我試過sed -Ei 's/cwe.mitre.org.*.html/<REPLACEMENT>/g' file.txt了,但這行不通。有沒有辦法<REPLACEMENT>成為正則運算式?sed手冊似乎沒有建議?
編輯:我對 sed 手冊有誤。它確實提到了它,請參閱https://www.gnu.org/software/sed/manual/sed.html的“5.7 反向參考和子運算式”部分。
uj5u.com熱心網友回復:
$ sed 's/\(cwe\.mitre\.org.*\)\.html/\1/' file
https://cwe.mitre.org/data/definitions/377
http://google.com/404.html
谷歌 sed 捕獲組。
uj5u.com熱心網友回復:
采用
sed -Ei 's/(cwe\.mitre\.org.*)\.html/\1/' file
解釋
NODE EXPLANATION
--------------------------------------------------------------------------------
( group and capture to \1:
--------------------------------------------------------------------------------
cwe 'cwe'
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
mitre 'mitre'
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
org 'org'
--------------------------------------------------------------------------------
.* any character except \n (0 or more times
(matching the most amount possible))
--------------------------------------------------------------------------------
) end of \1
--------------------------------------------------------------------------------
\. '.'
--------------------------------------------------------------------------------
html 'html'
反向參考由帶括號的模式片段捕獲的\1字串部分。如果您希望在結果中保留一段匹配項,請使用反向參考。
uj5u.com熱心網友回復:
GNUAWK解決方案,讓file.txt內容成為
https://cwe.mitre.org/data/definitions/377.html
http://google.com/404.html
然后
awk '/cwe\.mitre\.org.*\.html/{sub(/\.html$/,"")}{print}' file.txt
給出輸出
https://cwe.mitre.org/data/definitions/377
http://google.com/404.html
說明:如果您在行中找到提供的正則運算式,請使用空字串替換.html行尾 ( )。$每一行,不管改變與否,print。
(在 GNU Awk 5.0.1 中測驗)
uj5u.com熱心網友回復:
另一種可能是
% sed '/cwe\.mitre\.org/s/\.html//' try.txt
https://cwe.mitre.org/data/definitions/377
Nothing
hello.html
http://google.com/404.html
這并不比接受的答案更好(foo.html text http://cwe.mitre.org/bar.html例如,它會被混淆,但其他答案也可能假設一行只有一個相關的 URL)。然而,我提到它是對那個的補充,因為它有用地說明了 sed 命令可以以“地址”作為前綴,其中可以包括正則運算式。此腳本會洗掉.html包含cvw.mitre.org.
這個特性經常被遺忘,只是偶爾有用,但在適當的時候,它可以避免在s“模式”槽中出現其他復雜的正則運算式和反向參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/462309.html
