bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
我嘗試在文件夾中的每個點文件中替換每個/ sa/with/he /。我怎樣才能使它工作?Odd Sed錯誤信息
bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
我嘗試在文件夾中的每個點文件中替換每個/ sa/with/he /。我怎樣才能使它工作?Odd Sed錯誤信息
使用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%)。
glob模式.*
包含特殊目錄.
和..
,您可能不想將其包含在您的模式中。我想不出一個優雅的方式將它們排除在外,所以這裏是一個不雅的方式:
sed -i.bakkk -e "s$/sa/#/he/#g" $(ls -d .* | grep -v '^\.\|\.\.$')
+1。推薦find/xargs:find。 -type f -maxdepth 1 -name'。*'| xargs sed ... – pilcrow 2009-07-24 21:24:09
試試這個:
sed -i.bakkk -e "s#/sa/#/he/#g" `find .* -type f -maxdepth 0 -print`
這應該忽略所有的目錄(如.elm,.pine ,.mozilla)而不僅僅是。和..我認爲其他解決方案不抓住。
+在最後?是否與「;」一樣? ? – 2009-07-24 22:41:39