使用sed/awk改变grep的匹配输出

使用sed/awk改变grep的匹配输出,awk,sed,grep,Awk,Sed,Grep,我有一个包含以下内容的文件 <li data-row="1" data-col="2" data-sizex="1" data-sizey="1" class="red"> <article> <h1&g

我有一个包含以下内容的文件

           <li data-row="1" data-col="2" data-sizex="1" data-sizey="1" class="red">
            <article>
                                                            <h1>Some unique text</h1>
          
           <li data-row="1" data-col="3" data-sizex="1" data-sizey="1" class="red">
            <article>
                                                            <h1>More unique text</h1>

           <li data-row="1" data-col="3" data-sizex="1" data-sizey="1" class="red">
            <article>
                                                            <h1>Even more unique text</h1>
返回

<li data-row="1" data-col="3" data-sizex="1" data-sizey="1" class="red">

  • 但是如何将值从红色改为橙色呢?

    xmlstarlet这样的xml解析器更适合解析xml/html。如果您的输入严格遵循问题中提到的规则,您可以使用

    perl-i-0777-pe's/class=“\Kred(?”.\n.*\n.*更多唯一文本)/orange/”
    
    • -i
      用于就地编辑
    • -0777
      将整个输入作为单个字符串,因此这不适用于大型输入文件
    • class=“\K
      match
      class=“
      但不要将其作为匹配文本的一部分
    • 红色
      要匹配的文本
    • (?=”*\n.*\n.*更多唯一文本)
      匹配
      并检查前面两行是否有
      更多唯一文本
      
      • (?=regexp)
        是一个先行功能,不会成为匹配文本的一部分

    如果输入是有效的xml并且
    xmlstarlet
    可用,则以下内容可用于更新包含“更独特文本”的所有li元素的类属性:


    感谢这项工作,现在有可能在每个唯一颜色/字符串代码块之间都有文本/html代码,但由于某种原因,当我有颜色/字符串代码块时,perl命令不会更改颜色?你是说有多个匹配吗?在命令中最后一个
    /
    之后添加
    g
    标志。。
    grep -B 2 "More unique text" file | sed -e '2,4d'
    
    <li data-row="1" data-col="3" data-sizex="1" data-sizey="1" class="red">
    
    xmlstarlet ed -u '//li[contains(.,"More unique text")]/@class' -v 'orange' file