Find
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 .
首先,請確保您在 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" {} +