grep
имеет опцию -v
, которая инвертирует совпадение (т.е. возвращает несовпадающие строки).Опция -E
переводит grep в режим extended-regexp
(что позволяет +
и круглые скобки быть исключенными в шаблоне).
Шаблон, который вы можете использовать (разбит для ясности):
^ # beginning of string
[A-Z] # a single uppercase letter
[a-z]* # zero or more lowercase letters
( # start a group
_ # an underscore
[A-Z] # a single uppercase letter
[a-z]* # zero or more lowercase letters
)+ # close the group and it can appear one or more times
$ # end of string
Предполагая, что у вас есть файл test.dat
, который содержит 8 строк из вашего вопроса:
grep -E -v "^[A-Z][a-z]*(_[A-Z][a-z]*)+$" test.dat
Возвращает:
alph_Beta_Gamma
Alpha_beta_Gamma
Alpha_beta
Alpha_theta_Pi_Chi_Ming