Mysql 使用awk替换两个字符串或模式之间的文本

Mysql 使用awk替换两个字符串或模式之间的文本,mysql,wordpress,awk,Mysql,Wordpress,Awk,我有一个问题正在这里进行,但我是新的堆栈和不知何故线程被锁定或删除: 我正在使用一个WordPress数据库,在“post\u content”列中包含60000个左右的“posts”,我想删除那些html标记以及它们之间的文本。我的帖子内容如下所示: <p style="text-align: left;"><span style="color: #fffff;"> An entire paragraph of text around 200 words </sp

我有一个问题正在这里进行,但我是新的堆栈和不知何故线程被锁定或删除:

我正在使用一个WordPress数据库,在“post\u content”列中包含60000个左右的“posts”,我想删除那些
html标记以及它们之间的文本。我的帖子内容如下所示:

<p style="text-align: left;"><span style="color: #fffff;">
An entire paragraph of text around 200 words
</span></p>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
我想删除段落标记中的所有文本。因此,我想删除的是文本“一整段200字左右的文本”这一文本在每一篇文章上都是不同的,但一个常量是
打开和关闭标记

从我的最后一个问题开始,这个命令:由用户“PS”


awk'/您可以尝试下面的sed命令-

sed '/<p/,/<\/p/d' kk.txt

sed'/将GNU awk用于多字符:

awk -v RS='</p>\\s*' -v ORS= '{sub(/<p.*/,"")} 1' file

我不会使用awk、sed或perl。正如您所发现的,很难正确管理正则表达式。有一个老笑话:

有些人在遇到问题时会想 “我知道,我会使用正则表达式。”现在他们有两个问题。 -杰米·扎温斯基,1997年

我甚至不会转储数据并编辑转储文件。这也很难

一个更简单的解决方案是使用MySQL中内置的XPath函数直接在数据库中操作每篇文章。我测试了以下解决方案,查询了示例帖子内容的一个版本,去掉了
标记(以及其中的所有内容)

mysql> SELECT post_content, 
       UpdateXml(post_content, '/p', '') AS post_content_without_p 
       FROM posts\G
显示前后内容的输出为:

*************************** 1. row ***************************
          post_content: <p style="text-align: left;"><span style="color: #fffff;">
An entire paragraph of text around 200 words
</span></p>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>

post_content_without_p: 
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
1 row in set (0.00 sec)

在尝试这样的更改之前,请务必进行备份!或者在您进行实验时将数据复制到另一个数据库。

使用具有html解析库的脚本语言可能会更容易。awk似乎可以处理您提供的数据。你知道这不是一个infle edit命令,但它会将处理后的文件输出到stdout,你需要将其存储到一个文件中吗?@JamesBrown Update:做了一些研究,找到了如何将输出转储回sql文件的方法。所以我运行了这个命令:
awk'/
perl-pe's/+?//g'test\u perl.sql
@Michael sqlbot我运行这个命令时,当然是在交换文件名。导入了sql文件并查看了post_内容,我看到文本仍然存在。它似乎没有删除文本或更改html标记。我不确定出了什么问题,但我确信你的建议会有更好的效果。有什么想法吗?嘿,谢谢你的回复。我在database.sql的副本上尝试了该命令,然后将数据库导入mysql并通过phpmyadmin进行检查。它仍然显示了段落文本。当我运行您发布的确切命令时,它看起来像是在搜索和替换,但当我检查它时,我说文本仍然存在

此文本仍然存在


更新:好的,所以我执行了如下sed命令:
sed-I'//d.ariel是的,您的正则表达式太“贪婪”。您需要匹配
后接除

之外的任意数量的字符,然后再接

。否则,
太这个东西

不应该删除的东西

这个东西

太少
会被减少到
太少
,因为整个
..

是匹配的。@Michael sqlbot我应该使用awk还是sed?正则表达式的两个部分都是“贪婪”的,我使用了两个命令中的任何一个。确切的文本如下所示:

我要删除的文本

它们都是从

你能给我一些更好的正则表达式吗?@d.ariel-你能分享一些与你当前文件相关的输入文件数据吗?这些文件中的文本仍然存在,你不想出现在那里。我转储了当前正在工作的数据库。我运行:
awk-vrs='

\\s*'-vrs='{sub(/此外,我刚刚尝试转储数据库并将转储的.sql文件重新导入到新创建的数据库中,只要我没有对该文件运行awk命令,它就不会抛出错误。我发布的脚本是否会根据您发布的示例输入打印出预期的输出?如果不是,它以什么方式不同?如果它完全符合您的要求对于您的示例输入,但实际输入失败,那么您的示例输入并不真正代表您的实际输入,您必须找出并发布一个更具代表性的示例。如果它对您的示例输入不起作用,那么可能您没有使用GNU awk,或者您的输入与您发布的不一样,请告诉我们失败的症状ure/difference,如果您希望帮助调试它。基本上,我在terminal中运行该命令,它在没有打印任何内容或错误的情况下完成。我假设该命令已成功运行。我不确定是否需要单独安装GNU awk。在我这方面进行一些调试后,我看到它确实删除了.sql文件中实际输入的目标文本但是,在尝试将该.sql文件导入新数据库时,给我留下了一个错误。好消息是,多亏了您,我才使其正常工作。我转储了同一数据库的一个稍旧的副本,该副本在phpmyadmin搜索和替换中被滥用的情况稍少,但由于某些原因,它正常工作。这不是很科学,但您在答案确实是一个功能齐全的工作台。谢谢
awk -v RS='</p>\\s*' -v ORS= '{sub(/<p.*/,"")} 1' file
$ cat file
<p style="text-align: left;"><span style="color: #fffff;">
First entire paragraph of text around 200 words
</span></p>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
<p style="text-align: left;"><span style="color: #fffff;">
Second entire paragraph of text around 200 words
</span></p>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
$ awk -v RS='</p>\\s*' -v ORS= '{sub(/<p.*/,"")} 1' file
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
awk -v RS='</p>\\s*' -v ORS= '{sub(/<p style="text-align: left;"><span style="color: /,"")} 1' file
mysql> SELECT post_content, 
       UpdateXml(post_content, '/p', '') AS post_content_without_p 
       FROM posts\G
*************************** 1. row ***************************
          post_content: <p style="text-align: left;"><span style="color: #fffff;">
An entire paragraph of text around 200 words
</span></p>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>

post_content_without_p: 
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="309" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
[Text_between_brackets]
<iframe src="http://somewebsite.com" width="250" height="250" frameborder="0" marginwidth="0" marginheight="0" scrolling="NO"></iframe>
1 row in set (0.00 sec)
mysql> UPDATE posts SET post_content = UpdateXml(post_content, '/p', '');