2016-05-07 7 views
1

私は特定の部分だけを取得する必要があるHTMLファイルを持っています。ここでの最大の課題は、このHTMLファイルに改行がないため、grep表現がうまく機能しないことです。私はこのライン上の2つのアンカー(<a>)を持っているregexでgrep/sed/awkを使って行の一部だけを取得するには?

<a href="/link1" param1="data1_1" param2="1_2"><p>Test1</p></a><a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 

注:

は、ここに私のHTMLファイルです。

私は第二のアンカーを取得したいと私はそれを使用して取得しようとしていた。

cat example.html | grep -o "<a.*Test2</p></a>" 

残念ながら、このコマンドは、行全体を返しますが、私はしたい:

<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 

Iドンgrepやsedでこれを行う方法を知っていないので、本当に助けていただければ幸いです。マルチchar型のRSのためのGNUのawkで

+0

をXML/HTMLパーサ(xmllint、xmlstarletを...)を使用します。 – Cyrus

答えて

1

、それはあなたが欲しい秒レコードの場合:

$ awk 'BEGIN{RS="</a>"; ORS=RS"\n"} NR==2' file 
<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 

か、それは "Test2を" ラベルされたレコードの場合:

$ awk 'BEGIN{RS="</a>"; ORS=RS"\n"} /<p>Test2<\/p>/' file 
<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 

か:

$ awk 'BEGIN{RS="</a>"; ORS=RS"\n"; FS="</?p>"} $2=="Test2"' file 
<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 
0

Perlの使用:

$ perl -pe '@a = split(m~(?<=</a>)~, $_);$_ = $a[1]' file 
<a href="/link2" param1="data1_1" param2="1_2"><p>Test2</p></a> 

内訳:

perl -pe '          ' # Read line for line into $_ 
                # and print $_ at the end 
        m~(?<=</a>)~     # Match the position after 
                # each </a> tag 
      @a = split(   , $_);   # Split into array @a 
             $_ = $a[1] # Take second item 
0

これは、実行する必要があります。

grep -o '<a[^>]*><p>Test2</p></a>' example.html