【问题标题】:Match Anything In Between Strings For Linux Grep Command匹配 Linux Grep 命令的字符串之间的任何内容
【发布时间】:2017-02-24 07:17:07
【问题描述】:

我已经阅读了grep all characters including newline 的帖子,但我没有使用 XML,所以它与我的 Linux 命令有点不同。

我有以下数据:

Example line 0</span>
<tag>Example line 1</tag>
<span>Example line 1.5</span>
<tag>
Example line 2
</tag>
Example line 3
<span>Example line 4</span>

使用这个命令cat file.txt | grep -o '&lt;tag.*tag&gt;\|^--.*'我得到:

<tag>Example line 1</tag>

但是,我希望输出是:

<tag>Example line 1</tag>
<tag>Example line 2</tag>

如何匹配字符串之间的任何内容,包括换行符?

注意:我需要使用&lt;tag 和tag&gt; 作为字符串,因为其他文件可以在行之间包含多个标签和文本。将更新示例数据以显示这一点。

【问题讨论】:

    标签: regex linux bash grep pattern-matching


    【解决方案1】:

    使用gnu-awk 使用&lt;/tag&gt; 作为记录分隔符更容易做到这一点:

    awk -v RS='</tag>' 'RT {gsub(/\n/, ""); print $0 RT}' file
    
    <tag>Example line 1</tag>
    <tag>Example line 2</tag>
    

    【讨论】:

    • 需要使用&lt;tag和tag&gt;在它们之间穿梭。更新样本数据。对不起:-/
    • 好的试试这个:awk -v RS='&lt;/tag&gt;' 'RT {gsub(/.*?&lt;tag&gt;|\n/, ""); print "&lt;tag&gt;" $0 RT}' file
    • 嘿,Anbhava,这行得通!我将在此基础上提出另一个问题。谢谢:-)
    • 嘿 Anubhava,你有没有机会告诉我如何也匹配以“示例”开头的行?如果没有,我提出了一个问题:stackoverflow.com/questions/40052458/…
    【解决方案2】:

    考虑这个测试文件:

    $ cat file2
    Example line 0</span>
    <tag>Example line 1</tag>
    <span>Example line 1.5</span>
    <tag>
    Example line 2
    </tag>
    Example line 3
    <span>Example line 4</span>
    

    这会产生您想要的输出(需要 GNU sed):

    $ sed -z 's|\n||g; s|</tag>|&\n|g; s|[^\n]*<tag>|<tag>|; s|\n[^\n]*<tag>|\n<tag>|g; s|\n[^\n]*$|\n|' file2
    <tag>Example line 1</tag>
    <tag>Example line 2</tag>
    

    限制:请注意,使用非专业工具处理类似 XML 的文本可能非常脆弱。

    【讨论】:

    • 嘿约翰,对不起,数据确实有其他标签。我的例子太简约了。我已经更新了一点。
    • @DomainsFeatured 查看处理修改后的输入文件的代码的更新答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2014-10-09
    相关资源
    最近更新 更多