
我在我的 mac 上使用以下命令:
$find . -name “*.java” -exec sed -i ’s/foo/bar/g’ {} \;
而且似乎沒有效果。
我的目錄中有兩個以 .java 結尾的文件,其中都有 foo 文字。我錯過了什麼嗎?
編輯:徵求意見的結果
[aafghani-03:~/test amirafghani]$ find . -name "*.java" -exec sed -i 's/foo/bar/g' {} \;
sed: 1: "./bar.java": invalid command code .
sed: 1: "./foo.java": invalid command code .
答案1
首先,確保您在 shell 腳本中使用常規的 ascii 引號,例如"
和'
(分別為 ascii 程式碼0x22
和0x27
),因為您貼文中的範例包含非標準引號字元。如果你仔細觀察,它們看起來有些不同。這很可能是來自 Word、OOWriter 甚至瀏覽器視窗等富文本文件格式的複製貼上錯誤。
由於您使用的是 Mac,因此您很可能擁有 FreeBSD 實現sed
,在這種情況下,您必須這樣編寫命令:
find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +
(這裡使用+
而不是\;
避免sed
每個檔案運行一次呼叫)。
請注意,如果或有空格,則周圍的引號"s/foo/bar/g"
是必需的。foo
bar
在 FreeBSD 中,sed
此-i
標誌的實作需要一個參數:備份檔案的副檔名。例如,使用-i .bak
該命令將首先備份file1.txt
,file1.txt.bak
然後再在原始檔案中執行替換。使用空參數''
意味著不使用備份文件,這似乎正是您想要的。
GNU(或 NetBSD、OpenBSD、busybox)實作中的相同內容是:
find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +
謝謝@巴哈馬特和@米克爾和@pieter-breed透過您的評論改進我的答案。