Shell 如何打印包含两个“z”或两个“w”的单词(bash)

Shell 如何打印包含两个“z”或两个“w”的单词(bash),shell,grep,Shell,Grep,我试图在/usr/share/dict/words中打印包含两个w或两个z的单词。单词中的w和z在哪里并不重要。 我已经试过了,但不能正常工作: cat /usr/share/dict/words | grep ".+([wz]).+\1" cat /usr/share/dict/words | grep ".*([wz]).*\1" cat /usr/share/dict/words | grep "z{2}|w{2}" cat /usr/share/dict/words | grep "z.

我试图在/usr/share/dict/words中打印包含两个w或两个z的单词。单词中的w和z在哪里并不重要。 我已经试过了,但不能正常工作:

cat /usr/share/dict/words | grep ".+([wz]).+\1"
cat /usr/share/dict/words | grep ".*([wz]).*\1"
cat /usr/share/dict/words | grep "z{2}|w{2}"
cat /usr/share/dict/words | grep "z.*z|w.*w"
cat /usr/share/dict/words | grep "z.?z|w.?w"
cat /usr/share/dict/words | grep "z[^z].*z|w[^w].*w"

ERE支持的-E标志:

grep -E 'w.*w|z.*z' /usr/share/dict/words
grep -E '([wz]).*\1' /usr/share/dict/words

关于第二个,有些实现可能不支持ERE中的反向引用,因此不要依赖它,不要期望它在任何地方都能工作。

对于ERE支持,使用-E标志:

grep -E 'w.*w|z.*z' /usr/share/dict/words
grep -E '([wz]).*\1' /usr/share/dict/words
关于第二个,有些实现可能不支持ERE中的反向引用,因此不要依赖它,不要期望它在任何地方都能工作。

要将单词与两个w或z(而不是三个或更多)匹配,可以使用:

grep -E '^[^w]*w[^w]*w[^w]*$|^[^z]*z[^z]*z[^z]*$' /usr/share/dict/words
要匹配两个w或z而不是三个或更多的单词,可以使用:

grep -E '^[^w]*w[^w]*w[^w]*$|^[^z]*z[^z]*z[^z]*$' /usr/share/dict/words
对于awk,如何:

awk 'gsub("w", "&") >= 2 || gsub("z", "&") >= 2' /usr/share/dict/words
对于awk,如何:

awk 'gsub("w", "&") >= 2 || gsub("z", "&") >= 2' /usr/share/dict/words

就我个人而言,我觉得这两种不同的表达方式更具可读性:

$ grep -e 'z.*z' -e 'w.*w' /usr/share/dict/words | head
abuzz
adazzle
Albizzia
amidoazobenzene
amidoazobenzol
aminoazobenzene
arrowweed
arrowwood
arrowworm
athwarthawse

就我个人而言,我觉得这两种不同的表达方式更具可读性:

$ grep -e 'z.*z' -e 'w.*w' /usr/share/dict/words | head
abuzz
adazzle
Albizzia
amidoazobenzene
amidoazobenzol
aminoazobenzene
arrowweed
arrowwood
arrowworm
athwarthawse

要查看至少有2个ws或2个Z的单词,可以执行以下操作:

egrep "(z.*z|w.*w)" /usr/share/dict/words
egrep "^([^z]*z[^z]*z[^z]*|[^w]*w[^w]*w[^w]*)$" /usr/share/dict/words
说明:匹配包含至少2个Z或至少2个ws的任何行

要查看正好有2个ws或Z的单词,可以执行以下操作:

egrep "(z.*z|w.*w)" /usr/share/dict/words
egrep "^([^z]*z[^z]*z[^z]*|[^w]*w[^w]*w[^w]*)$" /usr/share/dict/words

说明:匹配以0个或多个非z/w字母开头、后跟一个z/w、后跟零个或多个非z/w字母、后跟一个z/w和另一组零个或多个非z/w字母的任何行。简言之,确保有2个字或ws。

要查看至少有2个字或ws的单词,可以执行以下操作:

egrep "(z.*z|w.*w)" /usr/share/dict/words
egrep "^([^z]*z[^z]*z[^z]*|[^w]*w[^w]*w[^w]*)$" /usr/share/dict/words
说明:匹配包含至少2个Z或至少2个ws的任何行

要查看正好有2个ws或Z的单词,可以执行以下操作:

egrep "(z.*z|w.*w)" /usr/share/dict/words
egrep "^([^z]*z[^z]*z[^z]*|[^w]*w[^w]*w[^w]*)$" /usr/share/dict/words


说明:匹配以0个或多个非z/w字母开头、后跟一个z/w、后跟零个或多个非z/w字母、后跟一个z/w和另一组零个或多个非z/w字母的任何行。简言之,确保有两个z或ws。

如果你有一个正则表达式,你会希望使用egrepI来表示你不同意投票人的意见,并希望他们提供比敷衍的点击按钮更完整的解释。你想只包含两个w或两个z,还是包含两个或更多w或两个或更多z?你和grep z.*z|w.*w关系密切,它将作为grep'z.*z\|w.*w'只包含两个w或两个z:pizza OK pizzazz不OK尴尬OK如果你有正则表达式,你可能不同意投票人的意见,希望他们能提供比敷衍的点击按钮更完整的解释。你想只包含两个w或两个z,还是包含两个或更多w或两个或更多z?你和grep z.*z|w.*w关系密切,它将作为grep'z.*z\'w.*w'只包含两个w或两个z:pizza OK pizzazz不OK尴尬的OKA BRE grep'z.*z\'w.*w'也可以:作为一点琐事,在my/usr/share/dict/american中,有1546个单词包含2'w'或2'z'zyzyva/ˈzɪzɪvə/是一种热带美洲象鼻虫,常与棕榈树共生。这是一只吻甲虫@BREs中的DavidCRankin交替是GNU的扩展。如果可移植性很重要,需要ERE版本。grep'z.*z\|w.*w'也可以:作为一点琐事,在my/usr/share/dict/american中,有1546个单词包含2'w'或2'z'Zyzzyva/ˈzɪzɪvə/是一种热带美洲象鼻虫,通常与棕榈树有关。这是一只吻甲虫@BREs中的DavidCRankin交替是GNU的扩展。如果可移植性很重要,则需要ERE版本。在这两个方面都应大于等于2。除非他只想要2-unclear@DavidC.Rankin谢谢你的评论。我不知道哪一个应该合适。现在我同意使用>=会更安全。我已经更正了我的回答。我在原始问题下添加了一条评论,要求澄清。我怀疑他们想要两个或更多,但这并不超出他们确切指的两个的可能性范围。我想他们可以选择。正好是两个。如果我更改>=by==谢谢,效果会很好。@Dj liwood感谢您的反馈。如果我的答案足够可读,那么您可以根据需要修改,这是我的荣幸。BR.在两个计数上均应大于等于2。除非他只想要2-unclear@DavidC.Rankin谢谢你的评论。我不知道哪一个应该合适。现在我同意使用>=会更安全。我已经更正了我的回答。我在原始问题下添加了一条评论,要求澄清。我怀疑他们想要两个或更多,但这并不超出他们确切指的两个的可能性范围。我想他们可以选择。正好是两个。如果我更改>=by==谢谢,效果会很好。@Dj liwood感谢您的反馈。如果我的答案足够可读,那么您可以根据需要修改,这是我的荣幸。BR.您的解决方案很有效,感谢您的解释;您的解决方案很有效,感谢您的解释;