gpt4 book ai didi

regex - 用于匹配文件中唯一单词的正则表达式

转载 作者:IT王子 更新时间:2023-10-29 00:47:02 25 4
gpt4 key购买 nike

要在文件中使用“UNIQUE:”作为唯一单词的前缀,我尝试使用 perl 正则表达式命令,例如:

perl -e 'undef $/;while($_=<>){s/^(((?!\b\3\b).)*)\b(\w+)\b(((?!\b\3\b).)*)$/\1UNIQUE:\3\4/gs;print $_;}' demo

在包含以下内容的演示文件中:

watermelon banana
apple pear pineapple orange mango
strawberry cherry
kiwi pineapple lemon cranberry watermelon
orange plum cherry
kiwi banana plum
mango cranberry apple
lemon

输出是:

watermelon banana
apple pear pineapple orange mango
strawberry cherry
kiwi pineapple lemon cranberry watermelon
orange plum cherry
kiwi banana plum
mango cranberry apple
UNIQUE:lemon

不幸的是,如果提前使用,\3 反向引用似乎没有得到处理。

是否有另一种方法可以使用另一个正则表达式或 Linux 机器上可用的其他常用命令来实现此目的? (grep, sed, awk,...)

非常感谢

编辑:不幸的是,许多解决方案仅适用于提供的不完整案例,对此我深表歉意,它也应该适用于如下文本:

{watermelon || banana}
apple = ( pear pineapple orange mango )
strawberry cherry
kiwi = pineapple = lemon = cranberry = watermelon
orange - plum = cherry
kiwi = banana + plum
mango = cranberry && apple
lemon

如果可以简化问题,单词可以加上 $ 或 @ 之类的前缀。

最佳答案

我看到您已经在使用 Perl。当您想使用散列来计算某些东西时,总是一个不错的方法...

#!/usr/bin/perl -w
use strict;

my %hash = ();
my $str;

while(<>) {
$str .= $_;
$_ =~ s/\W+/ /g;
map {$hash{$_}++} split ' ', $_;
}

for (keys %hash){
my $word = $_;
if($hash{$word}==1) {
$str =~ s/\($word)/UNIQUE:$word/g;
}
};

print "$str\n";

将输出:

{watermelon || banana}apple = ( UNIQUE:pear pineapple orange mango )UNIQUE:strawberry cherrykiwi = pineapple = lemon = cranberry = watermelonorange - plum = cherrykiwi = banana + plummango = cranberry && applelemon

使用正则表达式可能会很困难。您需要遍历整个文件两次。一次通过计算单词的所有出现次数,一次通过标记唯一单词。

上面的代码片段读取了一次输入,但将整个原始文本保留在 $str 中——如果输入很大,这显然是个坏主意。

关于regex - 用于匹配文件中唯一单词的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1665915/

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