find & sed(搜尋與取代)

find & sed(搜尋與取代)

我在我的 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 程式碼0x220x27),因為您貼文中的範例包含非標準引號字元。如果你仔細觀察,它們看起來有些不同。這很可能是來自 Word、OOWriter 甚至瀏覽器視窗等富文本文件格式的複製貼上錯誤。

由於您使用的是 Mac,因此您很可能擁有 FreeBSD 實現sed,在這種情況下,您必須這樣編寫命令:

find . -name "*.java" -exec sed -i '' "s/foo/bar/g" {} +

(這裡使用+而不是\;避免sed每個檔案運行一次呼叫)。

請注意,如果或有空格,則周圍的引號"s/foo/bar/g"是必需的。foobar

在 FreeBSD 中,sed-i標誌的實作需要一個參數:備份檔案的副檔名。例如,使用-i .bak該命令將首先備份file1.txtfile1.txt.bak然後再在原始檔案中執行替換。使用空參數''意味著不使用備份文件,這似乎正是您想要的。

GNU(或 NetBSD、OpenBSD、busybox)實作中的相同內容是:

find . -name "*.java" -exec sed -i "s/foo/bar/g" {} +

謝謝@巴哈馬特@米克爾@pieter-breed透過您的評論改進我的答案。

相關內容