Find

find & sed(搜尋和替換)

  • January 9, 2022

我在我的 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 .

首先,請確保您在 shell 腳本中使用正常 ascii 引號,例如"'(ascii 程式碼0x220x27,分別),因為您文章中的範例包含非標準引號字元。如果你仔細觀察,它們看起來有點不同。這很可能是來自 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" {} +

感謝@ bahamat、@Mikel 和@ pieter -breed用您的評論改進了我的回答。

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