【问题标题】:How to extract characters between the delimiters using sed?如何使用 sed 提取分隔符之间的字符?
【发布时间】:2011-12-02 20:08:46
【问题描述】:

我刚刚开始学习 sed。我想提取并打印 > 和

<span id="ctl00_ContentPlaceHolder1_lblRollNo">12029</span>

   <br /><b>Engineering & IT/Computer Science</b><br />

        <div id="ctl00_ContentPlaceHolder1_divEngITMerit">

                        <span id="ctl00_ContentPlaceHolder1_lblEngITSelListNo">3rd Provisional Selection List</span>

                <tr><td style='width: 200px' class='TblTRData'>IT/Computer Science/Software</td><td style='width: 150px'class='TblTRData'>7 (out of 471)</td><td style='width: 325px'class='TblTRData'>Selected in MS COMPUTER SCIENCE</td></tr>

                                Name:

                                <span id="ctl00_ContentPlaceHolder1_lblName">SIDRA SHAHID</span>

                                Father Name:

                                <span id="ctl00_ContentPlaceHolder1_lblFatherName">SHAHID RAFEEQ AHMAD</span>

我已经写好了命令:

sed -n -e '/^[^>]*>\([^<]*\)<.*/s//\1/p' myfile.txt

问题是它返回了一些 > 12029,但未在 Selected in MS COMPUTER SCIENCE 中选择。我做错了什么?

【问题讨论】:

标签: linux scripting sed


【解决方案1】:

如果您只需要提取标签之间的字符串,这意味着您需要删除标签,使它们之间的字符串保持不变。对吧?

sed 's/<[^>]*>//g'

它用空字符串(什么都没有)替换(所有出现的)标记(“”)。文本将保留。

【讨论】:

    【解决方案2】:

    在 sed 中,s 命令有一个 g 标志,用于对同一行上的所有模式事件进行操作。

    s/>\([^<]*\)</\1/pg
    

    可能就够了。

    【讨论】:

    • @mainajaved: 和这个正则表达式?
    • @mainajavaed :除非您的 sed 脚本使用 -n 选项调用,否则您可以尝试删除该命令末尾的“p”。这意味着打印,因此只要您成功匹配,就会打印该行,如果您没有-n 选项,可能会导致一些令人困惑的输出。但更重要的是,根据来自 Johnsweb 的链接和 Benoit 的原始评论,使用任何 reg-ex 工具解析 XML 永远不会取得任何长期成功。如果您说您正在尝试学习 sed,那么这真的不是开始学习的主题。祝你好运。
    猜你喜欢
    • 2016-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多