Digamos que eu tenha um arquivo com este conteúdo:
some:text:!someothertext
another:text:!!anothertext
Eu quero grep apenas para as linhas de texto que têm apenas uma ocorrência de '!'
Isso é o que eu tenho e parece funcionar, mas me pergunto se há uma maneira melhor.
grep -E ':![^!]' my_tex.txt
O seguinte usa
awk
and itsgsub()
para contar o número de pontos de exclamação em cada linha. O comando produzirá apenas linhas que contenham precisamente um ponto de exclamação. O&
substitui o(s) ponto(s) de exclamação correspondente(s) por ele mesmo.Você pode fazer algo semelhante com Perl e seu
tr
operador:Com
grep
você pode fazer da seguinte forma, o que evita tentar ser esperto:Ou seja, extraia as linhas que contêm um único ponto de exclamação e remova as linhas que contêm mais de um ponto de exclamação. Envolve um pipeline de dois
grep
comandos, mas fica claro o que o pipeline está fazendo, o que pode ser valioso em muitas circunstâncias. O segundogrep
pode ser simplificado paragrep -v -F '!!'
se você quiser evitar a substring específica,!!
mas ainda permitir coisas como!hello!
.eu usaria
sed
:Ou de uma maneira portátil multilinha:
Ou com a impressão de linha desabilitada pode ser ainda mais curta:
Com
GNU sed
eT
comando para verificar se uma solução falha:Todos funcionam da mesma forma: tentar substituir a segunda ocorrência de
!
na linha. Se a substituição for bem-sucedida (testada comt
), haverá pelo menos duas!
na linha e pule-a.resultado
Talvez o que você queira seja uma correspondência de linha inteira que consista em um ! cercado por zero ou mais não-! personagens - ou
ou