Shell
這個對 sed -i 的呼叫有什麼問題?
我有這條線
find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 sed -i 's/AAA/BBB/g'
我的意圖是從目前目錄遞歸地將所有文件中所有出現的 AAA 更改為 BBB,但具有以下副檔名的文件除外:.plist、.mp4 和 .DS*
但我收到了消息
sed: 1: "./myDir/pro ...": invalid command code .
最簡單的解決方案是使用這個:
find . -type f \( ! -name '*.plist' \) -and \( ! -name '*.mp4' \) -and \( ! -name '.DS*' \) -print0 | xargs -0 perl -pi -w -e 's/AAA/BBB/g'
與 GNU sed 不同,Mac OSX 附帶的 sed 需要一個參數來
-i
指定備份後綴;要禁止備份,您必須傳遞一個空字元串 (''
)。因此,sed 將 your 解釋s/AAA/BBB/
為備份後綴,並將您的第一個文件名 (./myDir/pro ...
) 作為要執行的命令。當然,.
不是一個有效的 sed 命令,導致錯誤。牢記這一點,以下將起作用:find [...] | xargs -0 sed -i.bak 's/AAA/BBB/g'
或者,如果您堅持禁止備份
find [...] | xargs -0 sed -i '' 's/AAA/BBB/g'