Apache 仅在特定行中替换文件中的内容

Apache 仅在特定行中替换文件中的内容,apache,ansible,Apache,Ansible,我有一个示例用例,其中我只想在文件中有限的几行中将“glob”替换为“url”。文件的其余部分不需要替换 /publishfarm { # client headers which should be passed through to the render instances # (feature supported since dispatcher build 2.6.3.5222) /clientheaders

我有一个示例用例,其中我只想在文件中有限的几行中将“glob”替换为“url”。文件的其余部分不需要替换

/publishfarm
        {
        # client headers which should be passed through to the render instances
        # (feature supported since dispatcher build 2.6.3.5222)
        /clientheaders
          {
                $include "clientheaders.any"
          }
        # hostname globbing for farm selection (virtual domain addressing)
        /virtualhosts
          {
                $include "publish-vhosts.any"
          }
        # the load will be balanced among these render instances
        /renders
          {
          $include "publish-renders.any"
          }
        # only handle the requests in the following acl. default is 'none'
        # the glob pattern is matched against the first request line
        /filter
          {
          # deny everything and allow specific entries
          /0001 { /type "deny"  /glob "*" }

          # open consoles
        #    /0012 { /type "allow" /glob "* /crx/*"    }  # allow content repository
        #    /0013 { /type "allow" /glob "* /system/*" }  # allow OSGi console

          # allow non-public content directories
        #    /0021 { /type "allow" /glob "* /apps/*"   }  # allow apps access
        #    /0022 { /type "allow" /glob "* /bin/*"    }


        #    /0024 { /type "allow" /glob "* /libs/*"   }
        #    /0025 { /type "deny"  /glob "* /libs/shindig/proxy*" } # if you enable /libs close access to proxy

        #    /0026 { /type "allow" /glob "* /home/*"   }
        #    /0027 { /type "allow" /glob "* /tmp/*"    }
        #    /0028 { /type "allow" /glob "* /var/*"    }


          /0023 { /type "allow" /glob "* /content*" }  # disable this rule to allow mapped content only

          # enable specific mime types in non-public content directories
      /0041 { /type "allow" /glob "* *.css *"   }  # enable css
      /0042 { /type "allow" /glob "* *.gif *"   }  # enable gifs
      /0043 { /type "allow" /glob "* *.ico *"   }  # enable icos
      /0044 { /type "allow" /glob "* *.js *"    }  # enable javascript
      /0045 { /type "allow" /glob "* *.png *"   }  # enable png
      /0046 { /type "allow" /glob "* *.swf *"   }  # enable flash
      /0047 { /type "allow" /glob "* *.svg *"   }  # enable SVG
      /0048 { /type "allow" /glob "* *.woff *"  }  # enable woff
      /0049 { /type "allow" /glob "* *.ttf *"   }  # enable ttf
      /0050 { /type "allow" /glob "* *.eot *"   }  # enable eot
      /0051 { /type "allow" /glob "* *.jpg *"   }  # enable jpg

      # enable features
      /0061 { /type "allow" /glob "POST /content/[.]*.form.html" }  # allow POSTs to form selectors under content
      /0062 { /type "allow" /glob "* /libs/cq/personalization/*" }  # enable personalization
      /0063 { /type "allow" /glob "POST /content/[.]*.commerce.cart.json" }  # allow POSTs to update the shopping cart


          # deny content grabbing
          /0081 { /type "deny"  /glob "GET *.infinity.json*" }
          /0082 { /type "deny"  /glob "GET *.tidy.json*"     }
          /0083 { /type "deny"  /glob "GET *.sysview.xml*"   }
          /0084 { /type "deny"  /glob "GET *.docview.json*"  }
          /0085 { /type "deny"  /glob "GET *.docview.xml*"   }
          /0086 { /type "deny"  /glob "GET *.*[0-9].json*"   }
          /0087 { /type "deny"  /glob "GET *.feed.xml*"      }
        #    /0088 { /type "allow" /glob "GET *.1.json*"        }  # allow one-level json requests
我只想在这些块中用url替换glob,而不是整个文件。 我想替换的内容是

      # enable specific mime types in non-public content directories
  /0041 { /type "allow" /glob "* *.css *"   }  # enable css
  /0042 { /type "allow" /glob "* *.gif *"   }  # enable gifs
  /0043 { /type "allow" /glob "* *.ico *"   }  # enable icos
  /0044 { /type "allow" /glob "* *.js *"    }  # enable javascript
  /0045 { /type "allow" /glob "* *.png *"   }  # enable png
  /0046 { /type "allow" /glob "* *.swf *"   }  # enable flash
  /0047 { /type "allow" /glob "* *.svg *"   }  # enable SVG
  /0048 { /type "allow" /glob "* *.woff *"  }  # enable woff
  /0049 { /type "allow" /glob "* *.ttf *"   }  # enable ttf
  /0050 { /type "allow" /glob "* *.eot *"   }  # enable eot
  /0051 { /type "allow" /glob "* *.jpg *"   }  # enable jpg
这里的问题是行号不是固定的。我怎样才能在ansible中实现这一点


我曾经这样做过:在这个文件中41,51s/glob/url在vim中打开,然后注意开始和结束行。但正如我所说,这些行号一直在变化。

我建议您可以编写一个脚本来定位所有具有
启用css
启用GIF
等功能的行号。将
glob
替换为
url

我可以通过以下命令执行此操作:

# ansible 127.0.0.1 -m replace -a "path='/my/path/test_file' regexp='W*(/glob)\W*(.*)W*(css)W*(.*)css$' replace='url \"* *.css *\"   }  # enable css'"
W*(/glob)\W*(*)W*(css)W*(*)css$
regex匹配“glob”和以“css”结尾的行之间的所有内容

应在任务文件中转换为以下内容:

- replace:
  path: /my/path/test_file
  regexp: 'W*(/glob)\W*(.*)W*(css)W*(.*)css$'
  replace: 'url \"* *.css *\"   }  # enable css''
这种方法的缺点是,您可能需要为每个css、GIF、ICO、javascript等都使用替换块

因此,更好的方法是与_项一起使用,并处理扩展和对我们正在进行的匹配的评论,如下所示:

- hosts: myhostgroup
  tasks:
    - replace:
        path: /my/path/test_file
        regexp: 'W*(/glob)\W*(.*)W*({{ item.extension }})W*(.*){{ item.comment }}$'
        replace: 'url "* *.{{ item.extension }} *"   }  # enable {{ item.comment }}'
      with_items:
        - { extension: 'css', comment: 'css' }
        - { extension: 'gif', comment: 'gifs' }
        - { extension: 'ico', comment: 'icos' }
        - { extension: 'js', comment: 'javascript' }
        - { extension: 'png', comment: 'png' }
        - { extension: 'swf', comment: 'flash' }
        - { extension: 'svg', comment: 'SVG' }
        - { extension: 'woff', comment: 'woff' }
        - { extension: 'ttf', comment: 'ttf' }
        - { extension: 'eot', comment: 'eot' }
        - { extension: 'jpg', comment: 'jpg' }

我相信正则表达式可以改进,但这对我在您的文件中的测试起到了作用。

如果我的答案是回答您的问题,如果您能这样标记,我将不胜感激。如果没有,我愿意了解如何改进。