我想知道是否可以{}
在sed
从find -exec
.
一个例子:
find "$dir" -type f -name "*" -exec sed -i s/hello{}a/hello{}b/g '{}' +
这会出现重复的错误消息{}
:
find: Only one instance of {} is supported with -exec ... +
有没有办法保留{}
在sed
命令中并被视为文字,而不是替换找到的文件find
?
答案1
在这种情况下,您可以find
通过捕获大括号表达式并在替换文本中使用反向引用来解决 exec 语法:
$ cat f1 f2
f1: hello{}a
f2: hello{}a
$ find . -type f -exec sed -i 's/hello\([{][}]\)a/hello\1b/g' '{}' +
$ cat f1 f2
f1: hello{}b
f2: hello{}b
或者,更简单(如评论中所述):
find "$dir" -type f -exec sed -i 's/\(hello[{]}\)a/\1b/g' {} +
请注意,-i
Sed 的选项不可移植,并且不能在任何地方都工作。给定的命令仅适用于 GNU Sed。
详细信息请参见:
答案2
一方面,你正在使用+
这意味着-exec
可以把多种的参数代替{}
.当与命令结合使用时,这不可能是您想要的结果sed
,并且有可能(尽管非常依赖于实现)您可以通过简单地删除+
.
然而,执行此操作的一般方法是使用sh -c
:
find "$dir" -type f -exec sh -c 'sed -i "s/hello$1a/hello$1b/g" "$1"' sh {} \;