**不使用**正規表示式在文字檔案中進行替換

**不使用**正規表示式在文字檔案中進行替換

我需要用替換內容替換文字檔案中的一些文字。通常我會做類似的事情

sed -i 's/text/replacement/g' path/to/the/file

問題在於 和text都是replacement包含破折號、斜線、黑斜線、引號等的複雜字串。如果我轉義裡面所有必要的字符,text那麼東西很快就會變得不可讀。另一方面,我不需要正規表示式的強大功能:我只需要按字面替換文字即可。

有沒有辦法進行文字替換沒有使用正規表示式和一些 bash 指令?

編寫一個執行此操作的腳本相當簡單,但我認為應該已經存在一些東西。

答案1

當您不需要正規表示式的功能時,請不要使用它。沒事兒。
但是,這並不是真正的正規表示式

sed 's|literal_pattern|replacement_string|g'

因此,如果/這是您的問題,請使用前者|,而無需逃避前者。

PS:關於評論,另請參閱 Stackoverflow 上的回答轉義 sed 搜尋模式的字串


更新: 如果你用得好的話珀爾嘗試一下,像\Q這樣\E

 perl -pe 's|\Qliteral_pattern\E|replacement_string|g'

@RedGrittyBrick 也在評論中建議了類似的技巧,具有更強的 Perl 語法這裡或者這裡

答案2

export FIND='find this'
export REPLACE='replace with this'
ruby -p -i -e "gsub(ENV['FIND'], ENV['REPLACE'])" path/to/file

這是這裡唯一 100% 安全的解決方案,因為:

  • 這是一個靜態替換,而不是正規表示式,不需要轉義任何內容(因此,優於使用sed
  • 如果您的字串包含 char,它不會中斷}(因此,優於提交的 Perl 解決方案)
  • 它不會破壞任何字符,因為ENV['FIND']使用的是,而不是$FIND。當$FIND您的文字內聯到 Ruby 程式碼中時,如果您的字串包含未轉義的'.

答案3

replace命令將執行此操作。

https://linux.die.net/man/1/replace

變更地點:

replace text replacement -- path/to/the/file

到標準輸出:

replace text replacement < path/to/the/file

例子:

$ replace '.*' '[^a-z ]{1,3}' <<EOF
> r1: /.*/g
> r2: /.*/gi
> EOF
r1: /[^a-z ]{1,3}/g
r2: /[^a-z ]{1,3}/gi

這個replace指令是 MySQL 或 MariaDB 附帶的。

答案4

您也可以使用 Perl 的\Q機制來“引用(禁用)模式元字符

perl -pe 'BEGIN {$text = q{your */text/?goes"here"}} s/\Q$text\E/replacement/g'

相關內容