簡體   English   中英

如何僅打印sed匹配項?

[英]How to print only matches with sed?

好的,這很簡單,但是我無法弄清楚。

基本上,我想從一個大的html文件中提取所有鏈接( <a href="[^<>]*">[^<>]*</a> )。

我試圖用sed來做到這一點,但是我得到了各種各樣的結果,但不是我想要的。 我知道我的regexp是正確的,因為我可以替換文件中的所有鏈接:

sed 's_<a href="[^<>]*">[^<>]*</a>_TEST_g'

如果我在類似的東西上運行

<div><a href="http://wwww.google.com">A google link</a></div>
<div><a href="http://wwww.google.com">A google link</a></div>

我懂了

<div>TEST</div>
<div>TEST</div>

我該如何擺脫其他一切,而只打印比賽? 我首選的最終結果是:

<a href="http://wwww.google.com">A google link</a>
<a href="http://wwww.google.com">A google link</a>

PS。 我知道我的regexp不是最靈活的,但足以滿足我的意圖。

匹配整行,將有趣的部分放在組中,然后替換為組的內容。 使用-n選項禁止顯示不匹配的行,並添加p修飾符以打印s命令的結果。

sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'

請注意,如果該行上有多個鏈接,則僅打印最后一個鏈接。 您可以對此進行改進,但它不僅限於簡單的sed使用。 最簡單的方法是使用兩個步驟:首先在任何兩個鏈接之前插入換行符,然后解壓縮鏈接。

sed -n -e 's!</a>!&\n!p' | sed -n -e 's!^.*\(<[Aa] [^<>]*>.*</[Aa]>\).*$!\1!p'

這仍然無法處理HTML注釋, <pre> ,分布在多行上的鏈接等。解析HTML時,請使用HTML解析器

假設每行只有一個超鏈接,則可能會起作用...

sed -e 's_.*&lta href=_&lta href=_' -e 's_>.*_>ed <<'EOF'
 -e 's_.*&lta href=_&lta href=_' -e 's_>.*_>_'

如果您不介意使用像sed這樣的perl,則可以使用非常多樣化的輸入進行復制:

perl -n -e 's+(<a href=.*?</a>)+ print $1, "\n" +eg;'

這可能對您有用(GNU sed):

sed '/<a href\>/!d;s//\n&/;s/[^\n]*\n//;:a;$!{/>/!{N;ba}};y/\n/ /;s//&\n/;P;D' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM