我有点问题。我需要过滤一个非常混乱的.htm文件。它没有新行,只是一连串的混乱。
基本上我从facebook获得了一个消息存档。我需要过滤来自特定人员的消息,以便我以后可以使用它。该文件中充满了特殊字符,对我来说有点复杂。
每封邮件都是这样的。
<span class="user">User Name</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p>
我唯一需要的是来自特定人的消息并将其输出到txt文件。
我感谢你的每一次帮助。
谢谢
答案 0 :(得分:2)
grep
喜欢这些东西:
$ grep -Po '(?<=<p>)[^<]*' file
MESSAGE I NEED
它开始从<p>
抓取字符串并一直持续到找到新的<
。
如果您想从<span class="user">User Name</span>
块中指定的特定用户获取数据,那么您可以执行以下操作:
$ user="User Name"
$ grep "<span class=\"user\">$user</span>" file | grep -Po '(?<=<p>)[^<]*'
MESSAGE I NEED
或硬编码名称:
$ grep '<span class="user">User Name</span>' file | grep -Po '(?<=<p>)[^<]*'
MESSAGE I NEED
答案 1 :(得分:1)
另一个awk
命令,
$ awk -v FS='(<p>|</p>)' '{print $2}' file
MESSAGE I NEED
我认为你需要这样的东西,
$ cat file
<span class="user">Bar</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p>
<span class="user">Foo</span><span class="meta">Date and sh*t</span></div></div><p>FOO starts with the letter F</p>
$ awk -v FS='(<p>|</p>)' '/Bar/{print $2}' file
MESSAGE I NEED
答案 2 :(得分:0)
有人这样吗?
awk '/Name/ {gsub(/<[^>]*>/, " ");$1=$1}1' file
User Name Date and sh*t MESSAGE I NEED
将名称更改为您需要的名称,这将删除标记。
答案 3 :(得分:0)
sed
版本:
$ sed -n 's/^.*<p>\([^<]*\)<.*$/\1/p' file
MESSAGE I NEED
答案 4 :(得分:0)
您的文件中没有换行符,因此要将其分解为每用户记录,我们需要将其他内容标识为记录分隔符。看起来</p>
是显而易见的选择。现在我们需要将每个记录分解为字段,以便将它们与每个<...>
对分开。现在给出一个包含2条记录的示例输入文件:
$ cat file
<span class="user">Jim Bob</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I NEED</p><span class="user">Bobby Joe</span><span class="meta">Date and sh*t</span></div></div><p>MESSAGE I DONT NEED</p>
我们可以输出字段(记录号,字段号,字段内容):
$ awk -v RS='</p>' -F'<[^>]+>' '{for (i=1;i<=NF;i++) print NR, i, $i}' file
1 1
1 2 Jim Bob
1 3
1 4 Date and sh*t
1 5
1 6
1 7
1 8 MESSAGE I NEED
2 1
2 2 Bobby Joe
2 3
2 4 Date and sh*t
2 5
2 6
2 7
2 8 MESSAGE I DONT NEED
3 1
并看到用户名是每条记录中的第二个字段,消息是第8个。
鉴于此,您可以轻松地测试/打印您想要的任何字段:
$ awk -v RS='</p>' -F'<[^>]+>' -v user="Jim Bob" '$2==user{print $8}' file
MESSAGE I NEED
请注意,上面使用GNU awk进行多字符RS。对于其他awks,最简单的方法是在调用脚本之前将所有</p>
字符串转换为控件字符,然后使用该控件字符作为RS。