我有一个包含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' {} \;
答案 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'
<强>解释强>
grep
和sed
都使用正则表达式模式,其中点字符.
表示任何字符,包括点本身。为了明确指出一个点,必须在它之前使用\
进行转义。因此,要搜索..
是必要的,请指定\.\.
,否则它可以匹配ab/cd/
现在,关于grep选项:
-m1
在找到第一个匹配项时停止搜索,避免搜索整个文件。-r
在目录中递归搜索--include \*.jsp
仅搜索具有FILEPAT文件模式的文件。