mac下如何使用Sed批量替換資料夾下的字串

Vultr發表於2018-07-10

前言:
實際工作中遇到一個問題:需要在某一個檔案下,將所有包含aaa字串全部替換為bbb字串。之前處理這種方式是用vim開啟各個檔案,進行編輯並批量替換。這次想用一個更方便的方法來實現,想到了sed命令。

實現用過過程中遇到了問題:

sed -i “s/aaa/111/g” test.txt

這條語句在linux平臺下可以正常執行。但是在mac下執行會報錯。
如下:

➜  practice sed -i "s/aaa/bbb/g"  test.txt
sed: 1: "test.txt": undefined label `est.txt`

檢視sed命令:

 man sed
............

     -i extension
             Edit files in-place, saving backups with the specified extension.  If a zero-length extension is given, no backup will be saved.  It is not recom-
             mended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is
             exhausted, etc.

從上面的解釋可得出,-i 需要並且必須帶一個字串,用來備份原始檔,並且這個字串將會加在原始檔名後面,構成備份檔名。
所以在mac下正確使用方式是這樣的:

➜  practice sed -i ""  "s/aaa/bbb/g"  test.txt
➜  practice

另外,如果不想用-i引數,那麼用如下的方法也可以實現

➜  practice sed   "s/bbb/aaa/g"  test.txt  > test2.txt
➜  practice mv test2.txt test.txt
➜  practice

sed -i 的問題解決了,接下來就是實現某個資料夾的批量替換,實現的程式碼如下:

在當前目錄下,將所有aaaModule都替換為bbbName
grep -rl `aaaModule` ./  | xargs sed -i "" "s/aaaModule/bbbName/g"

-r 表示搜尋子目錄
-l 表示輸出匹配的檔名

相關文章