奇数Sed错误消息

奇数Sed错误消息,sed,Sed,我尝试将文件夹中每个点文件中的/sa/替换为/he/。如何使其工作?全局模式*包括特殊目录和。,您可能无意将其包括在您的模式中。我想不出一个优雅的方式来排除他们,所以这里有一个不优雅的方式: bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .* sed: .: in-place editing only works for regular files 试试这个: sed -i.bakkk -e "s$/sa/#/he/#g" $(ls -d .* | gre

我尝试将文件夹中每个点文件中的/sa/替换为/he/。如何使其工作?

全局模式
*
包括特殊目录
,您可能无意将其包括在您的模式中。我想不出一个优雅的方式来排除他们,所以这里有一个不优雅的方式:

bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
试试这个:

sed -i.bakkk -e "s$/sa/#/he/#g" $(ls -d .* | grep -v '^\.\|\.\.$')

这应该忽略所有目录(例如.elm、.pine、.mozilla),而不仅仅是。和。。我认为其他解决方案无法解决此问题。

使用
查找-type f
仅查找与名称
*
匹配的文件,并排除目录
-maxdepth 1
防止
find
递归到子目录中。然后,您可以使用
-exec
执行
sed
命令,使用
{}
占位符告诉
查找
文件名应该放在哪里

sed -i.bakkk -e "s#/sa/#/he/#g"  `find .* -type f -maxdepth 0 -print`
使用
-exec
比使用backticks或
xargs
更可取,因为它甚至可以处理包含空格甚至换行符的奇怪文件名。是的,
“foo bar\nfile”
是一个有效的文件名。值得一提的是
find-print0 | xargs-0

find . -type f -maxdepth 1 -name '.*' -exec sed -i.bakkk -e "s#/sa/#/he/#g" {} +

同样安全。不过,它有点冗长,也不太灵活,因为它只适用于文件名位于末尾的命令(诚然,其中99%是文件名)。

+1。推荐查找/xargs:find-键入f-maxdepth 1-name'.*.|末尾是xargs sed…+吗?它是否与“?”;“将对每个文件运行一次命令相同,因此10个SED对应10个文件。“+”将在传递所有文件后运行它,将10个文件发送到1个sed。您的意思是像“rm.*”这样的命令删除dotfiles是不安全的吗?你应该选择:寻找-名称“.*”-exec rm'{}\?如果我没有弄错的话,“;”效率很低,所以对于大量的文件,+是首选。
find . -type f -maxdepth 1 -name '.*' -print0 | xargs -0 sed -i.bakkk -e "s#/sa/#/he/#g"