在 find -exec 的 sed 命令中使用文字空花括号 {}

在 find -exec 的 sed 命令中使用文字空花括号 {}

我想知道是否可以{}sedfind -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' {} +

请注意,-iSed 的选项不可移植,并且不能在任何地方都工作。给定的命令仅适用于 GNU Sed。

详细信息请参见:

答案2

一方面,你正在使用+这意味着-exec可以把多种的参数代替{}.当与命令结合使用时,这不可能是您想要的结果sed,并且有可能(尽管非常依赖于实现)您可以通过简单地删除+.

然而,执行此操作的一般方法是使用sh -c

find "$dir" -type f -exec sh -c 'sed -i "s/hello$1a/hello$1b/g" "$1"' sh {} \;

相关内容