奇数Sed错误消息

时间:2009-07-24 21:14:10

标签: sed

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

我尝试在文件夹中的每个点文件中替换每个/ sa / with / he /。我怎样才能让它发挥作用?

3 个答案:

答案 0 :(得分: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" {} +

使用-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"

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

答案 1 :(得分:2)

试试这个:

sed -i.bakkk -e "s#/sa/#/he/#g"  `find .* -type f -maxdepth 0 -print`

这应该忽略所有目录(例如.elm,.pine,.mozilla)而不仅仅是。和..我认为其他解决方案没有抓住。

答案 2 :(得分:1)

glob模式.*包含特殊目录...,您可能并不想将其包含在您的模式中。我想不出一种优雅的方式来排除它们,所以这是一种不雅的方式:

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