gpt4 book ai didi

regex - 使用 perl 单行和正则表达式删除具有特定模式的 2 行之间的所有行

转载 作者:行者123 更新时间:2023-12-05 09:00:36 25 4
gpt4 key购买 nike

我有一个巨大的文本(编辑:实际上不是那么“巨大”,只是更大更乱......)看起来像这样:

1. Ocalea picata STEPHENS.
LERUTH, 1935b, Ex. biol., XXIV, p. 240.
JEANNEL, 1909, Biosp., X, p. 484.
pp. 378 et 794.
Province de Luxembourg :
Marche-en-Famenne :Fond-des-Vaulx », Trou des \utons (B.
1. Oxypoda (Oxypoda) opaca GRAvENHoRsT.
SCHMITZ, 1909, Ex. biol., If, p. 89. — WoLr,
Catalogus, III, p. 379.
Limbourg belge:
Sinsin-lez-Heure, près de Marche-en-Famenne : Trou des Nutons

我想使用带有 perl 单行的正则表达式将此文本转换为:

1. Ocalea picata STEPHENS.
Province de Luxembourg :
Marche-en-Famenne :Fond-des-Vaulx », Trou des \utons (B.
1. Oxypoda (Oxypoda) opaca GRAvENHoRsT.
Limbourg belge:
Sinsin-lez-Heure, près de Marche-en-Famenne : Trou des Nutons

所以我想删除以数字开头然后是点然后是空格的行之间的所有行以及以“Province”或“Limbourg”开头的行

当我使用以下替换测试以下正则表达式 (^\d\. .*)\n(.*\n)*?(Province|Limbourg) 时,它完美运行: $1\n$3 在以下网站中: https://regex101.com/ (PCRE2 flavor ,但适用于所有 flavor )。

然而,当我用我的 perl one-liner 尝试它时,它什么也没做:

echo "1. Ocalea picata STEPHENS.
LERUTH, 1935b, Ex. biol., XXIV, p. 240.
JEANNEL, 1909, Biosp., X, p. 484.
pp. 378 et 794.
Province de Luxembourg :
Marche-en-Famenne :Fond-des-Vaulx », Trou des \utons (B.
1. Oxypoda (Oxypoda) opaca GRAvENHoRsT.
SCHMITZ, 1909, Ex. biol., If, p. 89. — WoLr,
Catalogus, III, p. 379.
Limbourg belge:
Sinsin-lez-Heure, près de Marche-en-Famenne : Trou des Nutons" |

perl -pe 's/(^\d\. .*)\n(.*\n)*?(Province|Limbourg)/\1\n\3/g'

我想我必须激活某种模式或修改器?
或者正则表达式可能有问题,但为什么它可以在上述网站上运行?

最佳答案

假设“巨大”文件仍然可以立即读入内存,因为问题中的尝试似乎是为了

perl -0777 -pe's/^[0-9]\. .*?\n\K.*?(Province|Limbourg)/$1/msg' file

评论

  • -0777 switch整个文件被一次读入一个字符串(“slurped”),在 $_ 中可用

  • Modifiers : /m 使 anchor ^$ 匹配多行字符串 inside 行的开头和结尾; /s 使 . 也匹配换行符; /g 通过字符串不断匹配

  • 匹配以数字(等)开头的行后,\K删除所有以前的匹配项(它们不会从字符串中“消耗掉”)所以我们不必担心将其放回去

  • 然后 .*? 匹配所有内容——包括换行符! (通过 /s 修饰符)——直到第一个 (Province|Lumbourg),它被捕获以便放回字符串中

  • 这会继续,因为 ^ 也匹配字符串中更远的行开头

关于捕获和替换,另一种选择是使用 lookahead

perl -0777 -pe's/^[0-9]\. .*?\n\K.*?(?=Province|Limbourg)//msg' file

现在我们根本不需要替换任何东西,因为先行不会消耗它匹配的字符(它只是“先行”断言它们在那里)

这两个都使用提供的输入打印所需的输出。

关于regex - 使用 perl 单行和正则表达式删除具有特定模式的 2 行之间的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75392586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com