13

这是我在wget来自网站的标准网页上使用的命令。

tr '<' '\n<' < index.html

但是它给了我换行符,但没有再次添加左侧中断。例如

 echo "<hello><world>" | tr '<' '\n<'

返回

 (blank line which is fine)
 hello>
 world>

代替

 (blank line or not)
 <hello>
 <world>

怎么了?

4

4 回答 4

28

那是因为tr只进行字符替换(或删除)。

试试sed吧。

echo '<hello><world>' | sed -e 's/</\n&/g'

awk

echo '<hello><world>' | awk '{gsub(/</,"\n<",$0)}1'

perl

echo '<hello><world>' | perl -pe 's/</\n</g'

ruby

echo '<hello><world>' | ruby -pe '$_.gsub!(/</,"\n<")'

python

echo '<hello><world>' \
| python -c 'for l in __import__("fileinput").input():print l.replace("<","\n<")'
于 2011-12-01T23:23:46.877 回答
3

如果您有 GNU grep,这可能对您有用:

grep -Po '<.*?>[^<]*' index.html

它应该通过所有的 HTML,但是每个标签应该从行的开头开始,可能的非标签文本在同一行之后。

如果你只想要标签:

grep -Po '<.*?>' index.html

但是,您应该知道,使用正则表达式解析 HTML并不是一个好主意。

于 2011-12-04T06:30:31.253 回答
2

放置换行符的顺序很重要。您也可以转义“<”。

`tr '<' '<\n' < index.html` 

也可以。

于 2013-10-03T21:27:43.917 回答
2

这对你有用吗?

awk -F"><" -v OFS=">\n<" '{print $1,$2}'

[jaypal:~/Temp] echo "<hello><world>" | awk -F"><" -v OFS=">\n<" '{$1=$1}1';
<hello>
<world>

您可以在操作前面放置一个正则表达式 //(您希望发生这种情况的行)awk {}

于 2011-12-01T23:38:56.550 回答