2016-11-22 58 views
0

我有一个包含jsp文件的文件夹。我用找到sed在一些文件中改变部分文本。该文件夹在版本控制之下。命令成功改变了指定模式的所有出现执行Linux sed命令和版本控制抱怨

问题是,当我与远程仓库,我可以看到列为修改实际上没有在该文件中已经改变了这么多文件同步的文件夹。我猜想我认为这个空白地方有问题。任何人都可以点亮这件事。

我试图取代../../images/spacer在所有JSP文件${pageContext.request.contextPath}/static/images/spacer当前文件夹 我使用的指挥下是如下

find . -name '*.jsp' -exec sed -i 's/..\/..\/images\/spacer/${pageContext.request.contextPath}\/static\/images\/spacer/g' {} \; 
+1

使用'-i'选项强制重写所有文件。你需要添加一个过滤器来只检索需要编辑的文件,所以'find ... | grep -l'srchTarg'| xargs sed -i'....'{}'可能会有所帮助。只尝试测试数据!祝你好运。 – shellter

+0

谢谢@shellter,我设法缩小了结果,然后appllied sed命令,但我仍然可以看到问题。现在,它仅限于包含搜索模式的文件。当我比较这些文件时,我可以看到某些行被突出显示为未经任何实际修改而被修改。因此,总结问题仍然存在,但仅限于包含搜索模式 – Vahid

+0

的文件,因此您需要使用其他过滤器来移除包含固定搜索模式的文件。也许'找到... | grep -l'srchTarg'| xargs grep -vl'fixedPattern'{} | xargs sed -i'...'{}'? (处理测试文件!)。祝你好运。 – shellter

回答

1

在大多数系统中,grep的有一个选项为递归搜索包含模式的文件,避免find

因此,这个命令将是:

grep -r -l -m1 "\.\./\.\./images/spacer" --include \*.jsp | 
    xargs -r sed -i 's!\.\./\.\./\(images/spacer\)!${pageContext.request.contextPath}/static/\1!g' 

说明

与正则表达式模式两者grepsed工作,其中TH点字符表示.包括点本身的任何字符。为了明确指出一个点,必须在它之前使用\进行转义。所以搜索..需要指定\.\.,也可以像ab/cd/

匹配文本现在,关于grep的选项:

  • -m1停止搜索时找到第一次出现,避免搜索整个文件。
  • -r在目录中递归搜索
  • --include \*.jsp仅在具有FILEPAT文件模式的文件中搜索。