Shell

這個對 sed -i 的呼叫有什麼問題?

  • January 8, 2013

我有這條線

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'

引用自:https://unix.stackexchange.com/questions/60491