我有一個文件,例如map.txt
,包含搜尋字串和相應替換的列表:
search -> replacement
bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...
我需要對資料夾中除符號連結之外的所有文件遞歸地執行搜尋和替換與上述匹配的所有字串。我知道如何一次做一個,如下圖:
$ find /some/folder -type f -exec sed -i 's/old_text/new_text/g' {} \;
如何使用上述映射大規模執行此操作?我讀過了這個問題,但不太明白。
答案1
回答
如果您不關心速度(這是一項一次性任務),那麼也許您可以嘗試以下操作:
cat map.txt | while read line; do
neww=${line##* };
oldw=${line%% *};
find /some/folder -type f -exec sed -i "s/$oldw/$neww/g" {} \;
done
我知道這不是最佳選擇...:-P
PS:檢查一個測試資料夾,看看它是否有效!
解釋
基本上:
- Cat 檔案map.txt。
- 閱讀每一行並獲取要替換的單字
$oldw
和替換內容$neww
。 - 對於每一對,執行您已經使用的 find 命令(請注意這次的雙引號,以便允許變數替換)。
關於參數擴展
為了設定變量$oldw
,$neww
我們必須取得每行的第一個和最後一個單字。為此,我們使用參數擴展(純 Bash 實作),儘管我們可以使用其他方法來獲取字串的第一個和最後一個單字(即cut
或awk
)。
${line##* }
:從變數 中line
,刪除最大前綴 (double#
) 模式,其中模式是任何字元 (*
) 後面跟著一個空格 ()。所以我們得到了最後一句話
line
。${line%% *}
:從變數 中line
,刪除最大後綴 (double%
) 模式,其中模式是一個空格 () 後面跟著任何字元 (
*
)。這樣我們就得到了第一個單字line
。
在本例中,單字之間用空格分隔,但我們可以使用任何分隔符號。
答案2
有時我需要搜尋和替換設定檔中的術語。
我寫了一個 github 上可用的腳本sandr - 搜尋與替換它允許創建/使用地圖並在文件中執行替換。
使用範例:
$ cat file
Voyez ce jeu exquis wallon, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches se consument dans l'âtre, ce qui lui permet de penser à la cænogenèse de l'être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre. Prouvez, beau j
$ cat map.txt
wallon => WALLON
se => SE
penser => PENSER
beau => BEAU
$ cat file | ./sandr -a map.txt
Voyez ce jeu exquis WALLON, de graphie en kit mais bref. Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l'alcôve ovoïde, où les bûches SE consument dans l'âtre, ce qui lui permet de PENSER à la cænogenèSE de l'être dont il est question dans la cauSE ambiguë entendue à Moÿ, dans un capharnaüm qui, penSE-t-il, diminue çà et là la qualité de son œuvre. Prouvez, BEAU j