前言:
實際工作中遇到一個問題:需要在某一個檔案下,將所有包含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 表示輸出匹配的檔名