确定缺少的开始分组字符并添加它

时间:2013-06-04 00:05:21

标签: regex replace

对答案的轻微修改效果很好! dropcaps">([a-zA-Z])</span>([^“]*)”


我正在编辑一些ePubs,我有一个系列,其中ePubs的发布方式不匹配。它会打扰我(我希望我的所有东西看起来都一样),所以我开始使用Sigil并更换封面,分离一些东西,并且通常让第二本书与第一本书相匹配。 / p>

现在我的问题出现在第一本书中,如果用引号打开一章,它会做这样的事情:

<p class="nonindent"><span class="dropcaps">“T</span>his is a quote,” Rob wrote to all of StackOverflow.</p>

但第二本书完全不同!我已经移动了一些CSS规则并使用了一些正则表达式来替换它的方式,但现在我遇到了另一个问题:

<p class="nonindent"><span class="dropcaps">F</span>orget an opening quote mark,” somebody told the publisher, “It'll just look silly.”</p>

现在,而不是一个漂亮的大“F和其他文本正常,我只有一个大F(即使它是一个引用)。我喜欢用开头的引语来看它的样子,虽然我可以浏览每一章并查看,但我没有看过这本书,我也不想为自己破坏任何东西。

有没有办法可以找到缺少的地方并将其添加到哪里?

有几种不同的情况:

<p class="nonindent"><span class="dropcaps">W</span>hoops,” only one quote.</p>

<p class="nonindent"><span class="dropcaps">F</span>orget an opening quote mark,” somebody told the publisher, “It'll just look silly.”</p>

<p class="nonindent"><span class="dropcaps">T</span>his is a regular sentence. “Fun times!”</p>

<p class="nonindent"><span class="dropcaps">T</span>his is a regular sentence. No quotes at all!</p>

它总是“dropcaps”,所以我开始使用类似的东西:

dropcaps">([a-zA-Z])</span>(.*)”并在答案dropcaps">([a-zA-Z])</span>([^"]*)”中尝试了这一点,但这些在第三个示例(我不需要开放)上会失败,因为它们会添加 1}}当我不需要时。

如果行中没有其他引号(如第一个示例),那将会有效,但在某些情况下(如第三个示例),有!我需要知道在它之前是否有一个“没有”,这将是它缺失的情况。用正则表达式做一个漂亮,干净的方法吗?

相同的解决方案适用于缺少任何开头的行(<([{),我刚刚意识到这一点。我会在此期间搜索,看看能不能找到类似的东西。

1 个答案:

答案 0 :(得分:0)

sed中使用的以下正则表达式如何:

sed 's/dropcaps">\([a-zA-Z]\)<\/span>\([^“]*\)”/dropcaps">“\1<\/span>\2”/' < book2 > book2.fixed

此处,代码段\([a-zA-Z]\)[a-zA-Z]匹配,并将匹配项存储为\1以用于替换模式。第二个\([^"]*\)"匹配一个字符序列,但引号以引号结尾并存储匹配为\2。然后替换只是在正确的位置使用这些(开放)引用。

此解决方案假设在您的第二本书中,区分了三种引号:", ”, “。如果不是这样的话,问题会变得更加困难。