[A-Z]* é zero ou mais ocorrências de [A-Z] . Há zero ocorrências de [A-Z] em ##2 , portanto, a linha corresponde. Você provavelmente deseja um ou mais ( \{1,\} (ou \+ com GNU grep ou compatível) ou + com a opção -E habilitando EREs) ou simplesmente ##[A-Z] como se correspondesse a ##[A-Z] , também corresponde a ##[A-Z]+ e vice-versa.
Observe também que, exceto na C / POSIX locale, o que é correspondido por [A-Z] não é especificado e a lista de caracteres (ou até mesmo possíveis elementos de agrupamento feitos de vários caracteres) varia de acordo com a localidade e sistema operacional. Nos sistemas GNU, geralmente são apenas caracteres do script latino (incluindo Dž ou É ), muitas vezes apenas letras maiúsculas, mas às vezes também minúsculas, incluindo as letras inglesas az (como no idioma tailandês para a Tailândia no Ubuntu 18.04 finalmente). Você obtém listas muito mais exóticas em alguns sistemas não-GNU como o Solaris. Para corresponder apenas a ABCDEFGHIJKLMNOPQRSTUVWXYZ, use [ABCDEFGHIJKLMNOPQRSTUVWXYZ] .