奇数Sed错误消息
我尝试将文件夹中每个点文件中的/sa/替换为/he/。如何使其工作?全局模式奇数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
*
包括特殊目录
和。
,您可能无意将其包括在您的模式中。我想不出一个优雅的方式来排除他们,所以这里有一个不优雅的方式:
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"