Bash

遞歸替換文件中很長的字元串

  • July 18, 2014

我在許多文件中有一個非常長且複雜的字元串,我想遞歸地刪除/替換它。該字元串包含許多斜杠、反斜杠和空格以及任何類型的特殊符號。我怎麼做?一個簡單的 find + sed 組合是行不通的,因為其中有我幾乎無法逃脫的所有特殊符號。

是否可以將搜尋字元串寫入文件並將其用作搜尋和替換命令的輸入?

我假設字元串可以包含除換行符和空字節之外的任何字元。您可以引用字元串以用作 sed 模式。字元$*./[\^前面必須有一個反斜杠。在替換文本中,您需要引用字元\&/

regexp=$(printf %s "$old" | sed 's:[$*./\[^]:\\&:g')
replacement=$(printf %s "$new" | sed 's:[\&/]:\\&:g')
sed -e "s/$regexp/$replacement/g"

如果你有 Perl,那就更簡單了。

export old new
perl -pe 's/\Q$ENV{old}/$ENV{new}/'

遞歸地作用於目前目錄及其子目錄中的所有文件:

regexp=$(printf %s "$old" | sed 's:[$*./\[^]:\\&:g')
replacement=$(printf %s "$new" | sed 's:[\&/]:\\&:g')
export regexp replacement
find . -type f -exec sh -c 'for x; do sed -e "s/$regexp/$replacement/g" <"$x" >"$x.new" && mv "$x.new" "$x"; done' _ {} +

或者

export old new
find . -type f -exec perl -i -pe 's/\Q$ENV{old}/$ENV{new}/' {} +

引用自:https://unix.stackexchange.com/questions/145382