我有一个奇怪的问题:我有一个代码(它是LaTeX,但在这里无关紧要),其中包含带句点(句子)的长行。为了更好的版本控制,我想将这些句子分别换行。这可以通过来实现sed 's/\. /.\n/g'
。
现在,如果也有带有潜在句点的评论,就会出现问题。这些注释不得更改,否则它们将被解析为LaTeX代码,这可能会导致错误等。
作为一个伪示例,您可以使用
Foo. Bar. Baz. % A. comment. with periods.
结果应该是
Foo.
Bar.
Baz. % ...
或者,该注释可以在下一行没有任何问题地进行。
perl
如果可以更好地使用,也可以使用。我尝试了不同的程序(sed
和perl
),但有一些想法,但没有达到我的预期。注释也被更改,或者仅第一时间段被更改(perl -pe 's/^([^%]*?)\. /\1.\n/g'
)。
你能为我指出正确的方向吗?
这很棘手,因为您实际上是在尝试匹配所有不跟在“%”之后的出现的“。”。负向后看在这里很有用,但是Perl不支持宽度可变的负向后看。(尽管在某些情况下有很多伪造它的方法。)在这里,我们可以使用回溯控制动词来摆脱它:
s/(?:%(*COMMIT)(*FAIL))|\.\K (?!%)/\n/g;
该(?:%(*COMMIT)(*FAIL))
部队更换停止首次通过承诺匹配,然后无条件失败,从而防止回溯看到一个“%”。“真实”匹配遵循交替:\.\K (?!%)
寻找一个在句点之后而不是“%”的空格。将\K
导致不包括在比赛期间,所以我们没有把它列入了更换。我们只匹配并替换空间。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句