我需要用替換內容替換文字檔案中的一些文字。通常我會做類似的事情
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'
答案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'