我刚刚开始学习如何使用 Ubuntu,遇到了一些困难。
我应该使用反向引用在我存储的婴儿名字文件中找到包含连续重复辅音的唯一女孩名字allnames.txt
。
我用了:
$ cat allnames.txt | cut -f5 | sort | uniq | grep -i 'bb\|cc\|dd\|ff\|gg\|hh\|jj\|kk\|ll\|mm\|nn\|pp\|qq\|rr\|ss\|tt\|vv\|ww\|xx\|yy\|zz'
而且看起来它有效,但是有没有更简单(更短),可能更准确的方法来做到这一点?
答案1
您可以使用-u
独特的排序:
cat allnames.txt | cut -f5 | sort -u | grep -Ei '([bcdfghjklmnpqrstvwxyz])\1'
这里我们假设字段由制表符分隔(例如This\tIs\tA\tFriend\tCarlos
),因为这是的默认分隔符cut
。
如果您确实需要频繁地执行此操作,当然您可能需要编写一个脚本。
答案2
您可以尝试这个:
cat allnames.txt | cut -f5 | sort | uniq | grep -Ei '(\w)\1+'
哪里-E
意味着允许使用扩展正则表达式
\w
指任何字母数字字符加 _
\1
引用先前创建的(\w)
角色
+
方法匹配前一个元素一次或多次。例如,ab+c 匹配“abc”、“abbc”、“abbbc”等,但不匹配“ac”。
仅适用于辅音:
cat allnames.txt | cut -f5 | sort | uniq | grep -Ei '([qrtpsdfghjklzxcvbnm])\1+'
[qrtpsdfghjklzxcvbnm]
所有辅音
所有引言来自维基百科。
答案3
假设有一个文件 ( name.txt
),其中包含以下内容,
abbcfgh
askgdf
rtdhher
ueiids
oofyf
asdgfhppn
aettdo
现在使用以下命令将打印具有连续重复辅音的字符串,
$ cat name.txt | grep -iEv '([aeiou])\1+' | grep -iE '([a-z])\1+'
abbcfgh
rtdhher
asdgfhppn
aettdo
怎么运行的
grep -iEv '([aeiou])\1+'
丢弃带有(使用反向匹配)连续重复元音的字符串。下一个grep -iE '([a-z])\1+'
列出带有连续重复辅音的字符串。
在你的情况下使用,
cat allnames.txt | cut -f5 | sort | uniq | grep -iEv '([aeiou])\1+' | grep -iE '([a-z])\1+'
特例
如果某个单词有两个连续的辅音和两个连续的元音,上述方法将不起作用。例如,aeeoiffsa
。在这种情况下,应使用以下方法,
cat allnames.txt | cut -f5 | sort | uniq | grep -iE '([b-df-hj-np-tv-z])\1+'