【问题标题】:How do I run a filter on pg_dump data during an import?如何在导入期间对 pg_dump 数据运行过滤器?
【发布时间】:2021-08-26 19:18:43
【问题描述】:

使用 Mac OSX (iTerm2) 上的终端,除了 postgres 之外没有任何外部应用程序,我想在一个相当大 (52 MB) 的 pg_dump 数据文件上运行一些正则表达式查找/替换,因为它被导入到 PostgreSQL 数据库中。我需要在转储文件到达 PostgreSQL 之前执行此操作,因为我必须转换用于创建和修改表的传入 SQL 查询。

我用来导入数据的shell命令是:

psql MyDatabase < mydata.sql

有没有办法通过正则表达式查找/替换过滤器来管道数据?我可以使用 grep 之类的原生 Linux 命令行实用程序做点什么吗?

或者,我将如何批处理我的正则表达式并将它们应用到我的转储文件,然后将更改保存到新文件?

【问题讨论】:

  • 现在的问题完全没用。说regex find/replace什么?在这里度过了一段时间,您不知道[ mcve ] 是什么?
  • @sjsam 我不明白你的意思。
  • 请编辑问题,添加有关您要替换的patternnew pattern 的信息。还可以考虑添加您可以使用的工具,例如 sed awk 等等。
  • @sjsam 我相信我达到了要点,即使用正则表达式在导入时从 pg_dump 文件转换数据。我什至列出了我正在使用的工具 - iTerm2 是一个 bash shell。
  • 事实上,我并没有试图表现得非常严厉,但我只能从下面的答案中理解主要意图 - 即管道。也撤回我的反对票.. ;)

标签: bash postgresql psql


【解决方案1】:

你可以使用理解正则表达式的sed

例如,要将所有出现在单词边界周围的“myschema”替换为“anotherschema”,您可以使用:

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql | psql MyDatabase

【讨论】:

  • 我试试看。如果我要运行多个正则表达式怎么办?有没有办法一次全部执行?
  • 当然。只需提供多个 -e 选项即可。
  • 感谢 sed 的建议。显然,如果您不熟悉 Linux 命令,那么您的问题是不能容忍的。如果您觉得我的问题并不愚蠢,也许您可​​以投票。谢谢!
【解决方案2】:

或者,我将如何批处理我的正则表达式并将它们应用于我的转储 文件,然后将更改保存到新文件?

sed -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql >mysqlnew.sql

这会将输出重定向到一个名为 mysqlnew.sql 的新文件。

注意sed 支持就地编辑选项。使用就地编辑-i 选项,上面的命令可以替换为

sed -i.bak -e 's/\bmy\(schema\)\b/another\1/g' mydata.sql

此命令将原始mydata.sql 复制到mydata.sql.bak 和 将更改永久写入mydata.sql

【讨论】:

  • -i 选项前应该有一个破折号
  • @RobertMikes 哦,是的!应该有一个。谢谢
猜你喜欢
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-05
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多