2009-07-24 109 views
3
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錯誤信息

回答

7

使用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%)。

+0

+在最後?是否與「;」一樣? ? – 2009-07-24 22:41:39

1

glob模式.*包含特殊目錄...,您可能不想將其包含在您的模式中。我想不出一個優雅的方式將它們排除在外,所以這裏是一個不雅的方式:

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

+1。推薦find/xargs:find。 -type f -maxdepth 1 -name'。*'| xargs sed ... – pilcrow 2009-07-24 21:24:09

2

試試這個:

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

這應該忽略所有的目錄(如.elm,.pine ,.mozilla)而不僅僅是。和..我認爲其他解決方案不抓住。