如何使用正则表达式使用grep / sed / awk只获得一行?

时间:2016-05-07 13:15:28

标签: shell awk sed scripting grep

我有一个HTML文件,我只需要获取一个特定的部分。这里最大的挑战是这个HTML文件没有换行符,所以我的grep表达式运行良好。

这是我的HTML文件:

<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>

请注意,我在这一行有两个锚点(<a>)。

我想获得第二个锚点,我试图使用它来获取它:

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

不幸的是,这个命令返回整行,但我只想要:

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

我不知道如何用grep或sed做到这一点,我真的很感激任何帮助。

3 个答案:

答案 0 :(得分:1)

使用GNU awk进行多字符RS,如果它是你想要的第二条记录:

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

或者如果它是标记为&#34; Test2&#34;:

的记录
$ 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>

答案 1 :(得分: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

答案 2 :(得分:0)

这应该做:

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