【发布时间】:2019-09-03 19:11:24
【问题描述】:
我正在使用find 和sed 替换多个文件中的字符串。这是我的脚本:
find ./ -type f -name "*.html" -maxdepth 1 -exec sed -i '' "s/${REPLACE_STRING}/${STRING}/g" {} \; -print
-print 总是打印文件,无论是否有更改。我想看看哪些文件被更改了。理想情况下,我希望输出是这样的(因为文件正在更改):
/path/to/file was changed
- REPLACE STRING line 9 was changed
- REPLACE STRING line 12 was changed
- REPLACE STRING line 26 was changed
/path/to/file2 was changed
- REPLACE STRING line 1 was changed
- REPLACE STRING line 6 was changed
- REPLACE STRING line 36 was changed
有没有办法做这样的事情?
【问题讨论】:
-
我以前也遇到过这种情况,但从未追求过更优雅的解决方案。然而,一个快速的解决方法是在调用
sed -i之前简单地grep文件是否包含${REPLACE_STRING}。为什么?sed -i将更新文件修改时间,无论是否执行替换。我会简单地做grep -q "${REPLACE_STRING}" "example.html" && sed -i "s/${REPLACE_STRING}/${STRING}/g" {} \; -print。不优雅,但对于单个文件,sed -i仅在"example.html包含${REPLACE_STRING}时才会执行 -
@DavidC.Rankin 我认为您不能在
-exec子句中使用&&,您必须将整个命令包装成sh -c或类似的。 -
哦,对了,但是因为这个例子是针对
-name "example.html" -maxdepth 1的,所以只需要一个没有find的简单grep。否则,通过-exec调用一个简单的帮助脚本,而不是将其全部放在-exec之后。 -
我正在对多个文件使用此功能,其中一个包含“*.php”,所以 grep 不起作用:/,我现在要更新我的问题。
标签: shell sed replace terminal find