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

时间:2017-07-03 11:35:22

标签: 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
          {
                $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中打开,然后记下开始和结束行。但正如我所说,这些行号不断变化。

2 个答案:

答案 0 :(得分:0)

我可以使用以下命令执行此操作:

# 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$正则表达式匹配“glob”和行尾的所有内容(如果它以“css”结尾)。

这应该转化为任务文件中的内容:

- replace:
  path: /my/path/test_file
  regexp: 'W*(/glob)\W*(.*)W*(css)W*(.*)css$'
  replace: 'url \"* *.css *\"   }  # enable css''

这种方法的缺点是你需要为每个css,gif,icos,javascript等替换块。

所以,更好的方法是使用with_items并处理扩展并评论我们正在进行匹配:

- 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' }

我确信正则表达式可以改进,但这适用于我对您的文件的测试。

答案 1 :(得分:-1)

我建议您编写一个脚本来查找包含enable cssenable gifs等所有行,以将glob替换为url