Regex 在bash中将字符串与特定数量的唯一字符匹配

Regex 在bash中将字符串与特定数量的唯一字符匹配,regex,string,bash,awk,sed,Regex,String,Bash,Awk,Sed,我需要删除文件中少于4个唯一字符的所有字符串 输入: hello cabby pabba lokka lappa coool apple 预期产出: hello cabby lokka apple 我试图想出一个正则表达式来实现这一点,但我想这怎么可能。 我确实发现了一个似乎很有希望的sed命令,它删除了所有重复的字符。但是,我不知道如何编程sed,以测试程序是否返回4个字符,如果返回,则与原始字符串匹配。 sed:1;s/\(\(.\).*\\2/\1/g;t'使用gnu awk: awk

我需要删除文件中少于4个唯一字符的所有字符串

输入:

hello
cabby
pabba
lokka
lappa
coool
apple
预期产出:

hello
cabby
lokka
apple
我试图想出一个正则表达式来实现这一点,但我想这怎么可能。 我确实发现了一个似乎很有希望的
sed
命令,它删除了所有重复的字符。但是,我不知道如何编程
sed
,以测试程序是否返回4个字符,如果返回,则与原始字符串匹配。
sed:1;s/\(\(.\).*\\2/\1/g;t'

使用
gnu awk

awk 'BEGIN{FS=""} {
unq=0; delete seen; for (i=1; i<=NF; i++) if (!seen[$i]++) unq++} unq > 3' file

FS=”“
在awk中将每个字符拆分为单独的字段。

您尝试的
sed':1;s/\(\(.\).*\\2/\1/g;t'
,请将
t
替换为
t1

在执行命令之前,复制保留空间中的当前行。
执行命令后,将行替换为原始行中至少剩下4个字符。
现在确保只打印至少包含四个字符的行

echo 'hello
cabby
pabba
lokka
lappa
coool
apple' | sed -nE 'h;:1;s/(.)(.*)\1/\1\2/g;t1;/.{4}/x;/.{4}/p'

我怀疑你能用
sed
做到这一点。即使在
grep
中使用PCRE正则表达式,纯正则表达式解决方案看起来也很笨拙,请参见
grep-vP'^(?:()\1*(?:(?!\1)()((?:\1 |\2)*)(?:(?:(?!\1 |\2 | 3)()(?:\1 |\2 |\3)*))(?:)(?:\1 |\2 | 3)*))(?))(?)(?:)文件
)。使用
awk
。请参阅。等等,不,你是对的,在这种情况下,我的文件中awk大约快4.2秒。是的,我在
36988000
行文件中测试了
sed
awk
解决方案
awk
花了大约1分钟完成,但
sed
在最后8分钟仍在运行,并且消耗了大量CPU:(可能需要提及。我确实同意您的答案可读性更好(更快)。谢谢Wakter。我明确表示,它需要gnuawk@ersan:您可以使用:
awk'BEGIN{FS=”“}{s=”“;unq=0;delete-seen;for(i=1;i3{print-s}'文件
仅处理第一个文件。
echo 'hello
cabby
pabba
lokka
lappa
coool
apple' | sed -nE 'h;:1;s/(.)(.*)\1/\1\2/g;t1;/.{4}/x;/.{4}/p'