执行Linux sed命令和版本控制抱怨

时间:2016-11-22 22:19:53

标签: linux bash sed

我有一个包含jsp文件的文件夹。我使用 find sed 来更改某些文件中的部分文本。此文件夹受版本控制。该命令成功更改了指定模式的所有实例

问题是当我将文件夹与远程存储库同步时,我可以看到如此多的文件被列为已修改,实际上该文件中的任何内容都没有更改。我认为白色空间有问题。任何人都可以对这个问题有所了解。

我正在尝试将当前文件夹下的所有jsp文件中的../../images/spacer替换为${pageContext.request.contextPath}/static/images/spacer 我正在使用的命令如下

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

1 个答案:

答案 0 :(得分: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都使用正则表达式模式,其中点字符.表示任何字符,包括点本身。为了明确指出一个点,必须在它之前使用\进行转义。因此,要搜索..是必要的,请指定\.\.,否则它可以匹配ab/cd/

等文字

现在,关于grep选项:

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