我需要用替换文本文件中的某些文本进行替换。通常我会这样做
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 搜索模式转义字符串。
更新:如果你觉得使用Perl尝试一下,\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
) - 如果字符串包含字符,它不会中断
}
(因此优于提交的 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'