INPUT | grep --color=always "$string\{1,1\}"
... infelizmente, todas as instâncias de $string são realçadas. Conforme leio os documentos, o '{1,1}' deve garantir que apenas a primeira instância seja destacada. Ou existe uma ferramenta melhor? não consigo usar sed
INPUT | sed -r "s|$string|${red}$string${nrm}|I"
(${red} e ${nrm} são apenas códigos de cores)
porque o INPUT aqui é uma lista de arquivos que podem ser encontrados sem distinção entre maiúsculas e minúsculas e se eu usar a opção 'I' com sed, força o caso da lista de arquivos a mudar para o texto exato da entrada para o comando - isso é, eu quero procurar arquivos sem maiúsculas e minúsculas, mas realçar insensivelmente qualquer que seja a caixa da string dentro da lista de arquivos.
my_command *file_name*
... usarei 'encontrar' para procurar os arquivos caso insensivelmente, mas na listagem quero destacar:
file_name
FILE_nAME
file_NAME_this_file_has_a_long_file_name
... mas apenas a primeira instância (um nome de arquivo pode conter repetições da string de entrada). Portanto, na última linha acima, 'file_NAME' é destacado, mas 'file_name' não.
grep não tem problemas com o caso, mas sed tem. OTOH, sed sabe como parar após uma partida e grep parece não. Ou há um jeito melhor?
Se o seu
grep
suporte-P
para regexps semelhantes a perl, você pode fazer:Isso só pode corresponder uma vez por linha, pois estamos usando
^
para ancorar a correspondência no início da linha. Isso é seguido por.*?
que corresponde a qualquer número de caracteres o mínimo possível e,$string
dentro de\Q
/\E
, o conteúdo da$string
variável é correspondido literalmente, mesmo que contenha operadores regexp (além de\E
).\K
especifica que apenas o que se segue deve serK
ept, portanto, colorido aqui.Ou você pode usar a coisa real e não ter que confiar em nenhum GNUismo:
Que funciona mesmo se
$string
contém\E
.Acho que você pode usar
sed
se usar a substituição de padrão (a correspondência não diferencia maiúsculas de minúsculas, mas a substituição usa o padrão capturado, não o pesquisado):Além disso, como @don_crissti notou, se você quiser colorir todo o padrão encontrado, nem precisa usar um grupo de captura, pode usar o
&
código "seja o que for" que provavelmente também é um pouco mais rápido:Usando duas strings em vez de códigos de cores, parece funcionar no meu bash:
O segundo "amd" na terceira linha não é substituído e todas as outras substituições mantêm sua caixa original.
A
grep
sintaxe significa que ele corresponderá à primeira repetição contínua de um padrão, portanto, em "bababa" corresponderá apenas ao primeiro "ba", mas em "baba___ba" corresponderá à primeira e à terceira ocorrência.Aparentemente, o grep colore toda a correspondência, portanto, não pode ser usado neste caso.