Regex grep for(curly | microsoft | smart)引号
我有一个巨大的文件夹,里面装满了xml文档,其中一些文档可能会断开,因为它们包含那些卷曲的引号,即Microsoft Word引号,即智能引号。我只是想快速检查一下,看看我面对的是什么。有人知道如何为他们辩护,这样我就可以很容易地找到罪犯吗 编辑 这里有一个简化的例子Regex grep for(curly | microsoft | smart)引号,regex,grep,Regex,Grep,我有一个巨大的文件夹,里面装满了xml文档,其中一些文档可能会断开,因为它们包含那些卷曲的引号,即Microsoft Word引号,即智能引号。我只是想快速检查一下,看看我面对的是什么。有人知道如何为他们辩护,这样我就可以很容易地找到罪犯吗 编辑 这里有一个简化的例子 <?xml version="1.0" encoding="UTF-8"?> <items> <item>Pretend this is a curly quote: '</item&
<?xml version="1.0" encoding="UTF-8"?>
<items>
<item>Pretend this is a curly quote: '</item>
</items>
假设这是一段卷曲的引语:'
如果它们是xml文档,您可以打开其中一个您知道包含违规引号的文档,以查看它们在xml文件中的确切外观(如果您无法用键盘轻松复制它们,请将它们复制到剪贴板)
假设您的引用看起来像
。
或“
,您可以执行类似于sed-i.bak的/[”/“/”/“/”file1 file2…
(如果在Windows上使用Linux/OSX/cygwin)要用普通引号快速替换有问题的引号,请在适当位置修改文件。卷曲引号具有以下Unicode代码点和UTF-8序列:
Name CodePoint UTF-8 sequence
---- --------- --------------
LEFT SINGLE QUOTATION MARK U+2018 0xE2 0x80 0x98
RIGHT SINGLE QUOTATION MARK U+2019 0xE2 0x80 0x99
SINGLE LOW-9 QUOTATION MARK U+201A 0xE2 0x80 0x9A
SINGLE HIGH-REVERSED-9 QUOTATION MARK U+201B 0xE2 0x80 0x9B
LEFT DOUBLE QUOTATION MARK U+201C 0xE2 0x80 0x9C
RIGHT DOUBLE QUOTATION MARK U+201D 0xE2 0x80 0x9D
DOUBLE LOW-9 QUOTATION MARK U+201E 0xE2 0x80 0x9E
DOUBLE HIGH-REVERSED-9 QUOTATION MARK U+201F 0xE2 0x80 0x9F
名称代码点UTF-8序列
---- --------- --------------
左单引号U+2018 0xE2 0x80 0x98
右单引号U+2019 0xE2 0x80 0x99
单低9引号U+201A 0xE2 0x80 0x9A
单高反9引号U+201B 0xE2 0x80 0x9B
左双引号U+201C 0xE2 0x80 0x9C
右双引号U+201D 0xE2 0x80 0x9D
双低-9引号U+201E 0xE2 0x80 0x9E
双高反向-9引号U+201F 0xE2 0x80 0x9F
XML通常存储在UTF-8中,因此您可以直接比较字节序列。可能是重复的 我遇到过这样一种情况,用户会从任何地方复制粘贴字符串,我必须允许他们输入除引号以外的任何特殊字符。引号在这方面可能很聪明/花哨/直接。让我举例说明:
Text |错误
----------------
O*Connor |是的
奥康纳|不
奥康纳|不
我为我的CF代码提出了以下解决方案
您可以找到包含上述UTF-8序列的文件:
grep -r -P "\xE2\x80\x9C" .
-r
使其具有递归性,-p
告诉grep使用与Perl兼容的正则表达式。我在Mac电脑上,内置的grep不能立即为我工作(neubert的回答)。我最终安装了自制版本的GNU grep:
brew tap homebrew/dupes
brew install homebrew/dupes/grep
然后我可以以类似的方式运行命令:
ggrep -r -P "\xE2\x80\x9C" .
etc.
我最终将dalle和neubert的答案结合起来,将运行我目前了解的所有案例,并将它们全部打印出来。请给出一个例子(摘录)好吗?如果这些文档中包含XML,w3c.org上有一个标准,定义了处理器、编码等的有效形式。您是指attribute=“value”吗“在元素中?如果有问题的引号只是内容怎么办?这是通过ssh实现的,有问题的部分看起来像–Y
,因此我担心这不起作用。如果文件不是utf-8怎么办?文件是utf-8,我在查找字节序列0xE2 0x80 0x99。”。但是,我仍然不清楚您是如何对其进行grep的。@sln:BOM或XML声明将告诉您使用了哪种编码,如果它们都不存在,则表示UTF-8。无论如何,如果XML文件不是UTF-8,那么可以先转换它。