【问题标题】:Replace string with special characters用特殊字符替换字符串
【发布时间】:2019-06-30 09:14:46
【问题描述】:

我正在尝试替换 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

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

【问题讨论】:

  • 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|' database.sql
  • 谢谢赛勒斯,不幸的是这个组合并没有改变任何东西。
  • 显然涉及\[\]的数量。做一个更小的测试用例,让它工作。我见过我需要 5 个“\”字符的情况,但它可以是 1 到 5 之间的任何字符(也许更多!),所以尝试一下。祝你好运。
  • 和 ...echo "http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png" | sed 's#http:\\/\\/firstdomain.com\\/qwe rty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png#https:\\/\\/seconddomain.com\\/wp-content\\/uploads\\/2019\\/06\\/section-shape. png#' 产生您需要的输出。一定还有别的,你是不是想在php 中这样做?为什么不在您的 Q 中包含一个实际文件的小样本,以便我们进行适当的测试?祝你好运。
  • @shelter 在我的脑海中浮现,我认为如果您需要超过 2 个反斜杠(甚至可能是 1 个),那么您的引用错误。例如,echo "http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png" 应该是 echo 'http:\\/\\/firstdomain.com\\/qwerty\\/wp-content\\/uploads\\/2018\\/07\\/section-shape.png'(即单引号而不是双引号),因此 shell 不会删除每对引号中的一个。

标签: php mysql linux bash sed


【解决方案1】:

您不能认真地将sed 应用于.db 文件,因为...嗯,它是数据库文件而不是文本(顺便说一句,很可能是 sqlite)。

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

【讨论】:

  • 感谢您的回答,但该文件是mysql数据库的备份,是文本文件。
  • 好的。那时你应该提到它。您能否发布部分数据库备份文件,显示要替换的路径的外观?
  • 我在帖子中提到了所有内容。我只需要将字符串替换为新字符串的外观即可。
【解决方案2】:

您的第一个错误是将脚本用双引号而不是单引号括起来,从而导致 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

【讨论】:

    猜你喜欢
    • 2021-11-17
    • 2015-03-17
    • 1970-01-01
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多