奇数Sed错误消息

Léo*_* 준영 4 sed

bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
Run Code Online (Sandbox Code Playgroud)

我尝试在文件夹中的每个点文件中替换每个/ sa/with/he /.我怎样才能让它运转起来?

Joh*_*ica 8

用于find -type f仅查找与名称匹配的文件.*并排除目录....-maxdepth 1防止find递归到子目录.然后,您可以使用占位符-exec来执行sed命令,{}以告知find文件名的位置.

find . -type f -maxdepth 1 -name '.*' -exec sed -i.bakkk -e "s#/sa/#/he/#g" {} +
Run Code Online (Sandbox Code Playgroud)

使用-exec优先级比使用反引号更好,xargs因为它甚至可以在包含空格甚至换行符的奇怪文件名上工作 - 是的,"foo bar\nfile"是一个有效的文件名.值得一提的是find -print0 | xargs -0

find . -type f -maxdepth 1 -name '.*' -print0 | xargs -0 sed -i.bakkk -e "s#/sa/#/he/#g"
Run Code Online (Sandbox Code Playgroud)

这同样安全.但它更冗长,而且灵活性较低,因为它只适用于文件名最后的命令(不可否认,99%的命令).

  • “;” 将为每个文件运行一次命令,因此 10 个文件需要 10 个 sed。“+”将在将*所有*的文件传递给10个文件的1个sed后运行它。 (2认同)