Linux下如何批量替換多文件字符串?
老胡的辦法:Linux中提到替換,首先想到的就是sed命令。無論是單個文件還是多個文件,使用sed都可以利用正則表達式來匹配和替換響應的內容,針對題主的問題,老胡分析了幾種情況,下面一一進行說明:
一、最常見的單字符串替換單字符串替換是最常見的情況,比如在當前目錄的一批文件中,用“man”來替換“ager”。用sed命令來實現(xiàn)需要用到正則表達式操作:
sed -i -- "s/man/ager/g" *正則表達式中,s/M/N/的含義是將M替換為N,g的含義是全局搜索。所以上面的正則表達式的的含義就是在全局內搜索字符串“man”,并且替換為“ager”。
常見的很多文章使用的是類似
sed -i "s/man/ager/g" *這樣的用法,其實這是不夠嚴謹?shù)模绻?代表的文件名恰好是“--debug”這樣與sed的參數(shù)相同的名字,命令的執(zhí)行就會出錯。所以這里要使用“--”參數(shù)定界符,來標記其后的所有字符串都不被視作參數(shù)。
二、find與sed搭配使用適配特殊情形有時候單獨使用sed可能比較難適用于一些特殊的情況,比如我只想對某個目錄下的所有子目錄中php類型的源碼文件進行查找替換,單獨用sed就不好辦到了。一般這個時候需要與find搭配起來使用:
find . -name -type f -name "*.php" -exec sed -i 's/man/ager/g' {} +-exec <command> { } + 的作用是在find命令之后使用輸出的結果作為參數(shù)來執(zhí)行后面的命令,等價于:
find . -name -type f -name "*.php" | xargs -I{} sed -i 's/man/ager/g' {}三、遞歸遍歷所有子目錄進行替換除了使用find之外,利用shell選項配置也可以用for循環(huán)來實現(xiàn)遞歸遍歷所有子目錄進行替換:
(shopt -s globstar dotglob; for file in **; doif [[ -w $file ]]; thensed -i -- 's/man/ager/g' "$file"fidone)globstar是shell選項,打開后就可以使用**通配符,**代表遞歸匹配多級目錄。最外面的圓括號是為這一段代碼創(chuàng)建一個子shell,避免shopt會對全局的shell環(huán)境造成影響。
四、其他例如:
sed -i 's/A/B/g; s/C/D/g; s/E/F/g' file可以實現(xiàn)批量字符串查找替換;
sed -Ei 's/A|B|C/D/g' file可以實現(xiàn)將A、B、C都替換為D。類似的還有很多,如果老胡要一個個介紹的話恐怕要敲上幾萬字。感興趣的朋友可以在評論區(qū)留言討論。
總結一下,批量替換多文件字符串的思路太多了,主要分為兩個步驟:首先要解決的是如何獲取文件列表,sed本身就可以通過*訪問某目錄下的所有文件,此外還可以使用find;其次就是使用何種正則表達式來實現(xiàn)更高效的替換。sed的用法可謂千變萬化,還是需要多多練習才好掌握。
如果我的回答對你有點價值,請莫忘點贊加關注,謝謝!歡迎在評論區(qū)發(fā)表各種意見。
本文為作者原創(chuàng),嚴禁轉載,違者必究。