Я только начинаю изучать, как использовать 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'
и похоже, что это сработало, но есть ли более простой (более короткий) и, возможно, более точный способ сделать это?
Вы можете использовать -u
для уникальной сортировки:
cat allnames.txt | cut -f5 | sort -u | grep -Ei '([bcdfghjklmnpqrstvwxyz])\1'
Здесь мы предполагаем, что поля разделены символом табуляции (например, This\tIs\tA\tFriend\tCarlos
), так как это разделитель по умолчанию для cut
.
Если вам действительно нужно делать это часто, вы, возможно, захотите написать скрипт.
Вы можете попробовать это:
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]
только все согласные
Все цитаты из Википедии .
Рассмотрим файл (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+'