获取特定标签之间的特定文本

时间:2017-03-08 17:59:48

标签: regex awk sed

在HTML文件的顶部,我有......

<H2>City</H2>
<P>Liverpool</P>

<H2>City</H2>
<P>Dublin</P>

我希望在<H2>City</H2>个实例之后直接在

标记之间输出文本。所以在上面的例子里面是单独的文件,我想打印出利物浦,在第二个例子中,都是都柏林。

看看这个thread,我试试:

sed -e 's/City\(.*\)\/P/\1/'

我希望能在那里找到我...但是这只是打印出整个文件。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

awk救援!你需要多字符RS支持(gawk有它)

$ awk -F'[<>]' -v RS='<H2>City</H2>' 'NF{print $3}' file

另一种方法可以是

$ awk 'c&&c--{sub(/<[^>]*>/,""); print} /<H2>City<\/H2>/{c=1}' file

在City之后找到下一条记录并修剪尖括号......

答案 1 :(得分:1)

尝试使用以下正则表达式

(?s)(?<=City<\/H2>\n<P>).*?(?=<\/P>)

参见 regex demo / explanation

<强> SED

sed -e 's/(?s)(?<=City<\/H2>\n<P>).*?(?=<\/P>)/'

答案 2 :(得分:1)

我查了一下,\s似乎不适用于空格。您应该使用换行符\n

sed -e 's/<H2>City<\/H2>\n<P>\(.*\)<\/P>/\1/'

不需要使用lookbehind(如上所述),这是一种矫枉过正。

答案 3 :(得分:1)

使用sed,您可以使用n命令读取模式后的下一行。然后只需删除标记即可输出您的内容:

sed -n '/<H2>City<\/H2>/n;s/ *<\/*P> *//gp;' file

答案 4 :(得分:1)

我认为这应该适用于你的mac:

echo -e "<H2>City</H2>\n<P>Dublin</P>" |awk -F"[<>]" '/City/{getline;print $3}'
Dublin