文本文件中的替换无需使用正则表达式

文本文件中的替换无需使用正则表达式

我需要用替换文本文件中的某些文本进行替换。通常我会这样做

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'

@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
  • 如果字符串包含字符,它不会中断}(因此优于提交的 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'

相关内容