用sed提取文本

时间:2015-05-23 13:23:33

标签: regex linux sed

我有这个文本文件(它实际上是html的一部分):

A  
|_B 
| |_D
| |_F
|_C
|_E
|_G 

public class Foo
{
    public virtual int FooId { get; set; }
    public virtual IList<Foo> Children { get; set; }
    public virtual Foo Parent { get; set; }
}

using (var session = NHibernateHelper.OpenSession())
{
     var CC = session.CreateCriteria(typeof(Foo));
     CC.SetFetchMode("Children", FetchMode.Eager);
     return CC.List<Foo>();
}

我已经使用这个sed命令来提取“Mycity”

<tr>
              <td width="10%" valign="top"><P>Name:</P></td>
              <td colspan="2"><P>
                XXXXX
              </P></td>
            </tr>
            <tr>
              <td width="10%" valign="top"><p>City:</p></td>
              <td colspan="2"><p>
                Mycity
              </p></td>
            </tr>
            <tr>
              <td width="10%" valign="top"><p>County:</p></td>
              <td colspan="2"><p>
                YYYYYY
              </p></td>
            </tr>
            <tr>
              <td width="10%" valign="top"><p>Map:</p></td>
              <td colspan="2"><p>
                ZZZZZZZZ

据我所知,正则表达式有效,但我得到

$ tr -d '\n' < file.html | sed -n 's/.*City:<\/p><\/td>.*<p>\(.*\)<\/p><\/td>.*/\1/p'

而不是Map:

我用Rubular测试了REGEX,但是没有用sed工作。 是不是正确的工具?我做错了什么?

PS:我正在使用Linux

2 个答案:

答案 0 :(得分:2)

您现在遇到的问题是默认情况下正则表达式是贪婪的

self.request.session.update({
    'path_one_images': PATH_ONE_IMAGES,                   
    'images': images,
    'slider_DV_values': slider_DV_values,
    'instruction_task_one_images': INSTRUCTION_TASK_ONE_IMAGES,
    'instruction_task_two_images': INSTRUCTION_TASK_TWO_IMAGES
})

所以它匹配到最后一节的所有内容。要非贪婪,请使用's/.*City:<\/p><\/td>.*<p>\(.*\)<\/p><\/td>.*/\1/p' ^ // here!

?

答案 1 :(得分:2)

对于涉及处理多行的任何事情,

sed始终是错误的工具。只需使用awk,就可以发明它:

$ awk 'c&&!--c; /City:/{c=2}' file.html
                Mycity

请参阅Printing with sed or awk a line following a matching pattern