Bash
遞歸替換文件中很長的字元串
我在許多文件中有一個非常長且複雜的字元串,我想遞歸地刪除/替換它。該字元串包含許多斜杠、反斜杠和空格以及任何類型的特殊符號。我怎麼做?一個簡單的 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}/' {} +