用特殊字符替换字符串

时间:2019-06-30 09:14:46

标签: php mysql linux bash sed

我正在尝试在wordpress sql文件中替换以下字符串:

http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png

https:\\/\\/seconddomain.com\\/wp-content\\/uploads\\/2019\\/06\\/section-shape.png

我尝试了以下显然不起作用的命令

sed -i "s#'http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png'#'https:\\/\\/seconddomain.com\\/wp-content\\/uploads\\/2019\\/06\\/section-shape.png'#g" database.sql

请有人帮助了解我错过的地方。非常感谢。

2 个答案:

答案 0 :(得分:1)

您不能将sed应用于.db文件,因为...好吧,它是数据库文件而不是文本(顺便说一下,是sqlite)。

相反,您应该使用SQLite控制台(或您拥有的任何SQL客户端)中的(UPDATE)SQL查询执行字符串替换。例如,请检查此链接以获取SQLite中的replace方法。

答案 1 :(得分:0)

您的第一个错误是将脚本用双引号而不是单引号引起来,从而邀请shell在sed看到它之前先解析其内容,从而吃掉一层反斜杠。

如果您必须处理单引号(不应该给您已发布的示例输入,但无论如何...),请不要这样做:

sed "s/foo'bar/stuff/"

改为执行此操作:

sed 's/foo'\''bar/stuff/'

因此shell不会解释脚本的每个部分。

除此之外-sed不能理解文字字符串(请参见Is it possible to escape regex metacharacters reliably with sed),因此只能使用一种工具,例如awk:

awk '
  BEGIN { old=ARGV[1]; new=ARGV[2]; ARGV[1]=ARGV[2]="" }
  s=index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
1' \
  'http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png' \
  'https:\\/\\/seconddomain.com\\/wp-content\\/uploads\\/2019\\/06\\/section-shape.png' \
  file
https:\\/\\/seconddomain.com\\/wp-content\\/uploads\\/2019\\/06\\/section-shape.png