Substituir múltiplas instâncias da mesma linha por apenas uma instância?

Substituir múltiplas instâncias da mesma linha por apenas uma instância?

O título diz isso, realmente. Basicamente, estou tentando condensar um arquivo de log enorme.

Notepad++ e Regex (eu sei um pouco) podem excluir essas linhas repetitivas, mas o problema é que não quero que todas sejam excluídas. Quero que uma instância permaneça para preservar a estrutura/ordem das mensagens de log.

Pesquisei muitas respostas no Google, mas só pareço obter resultados comoesse. O problema é que não estou apenas tentando substituir ou excluir linhas.

Neste ponto, acho que é mais provável que Regex tenha uma resposta, mas ainda estou naquele estágio em que não sei quais ferramentas estão disponíveis.

Editar:

Exemplo de mensagens das quais tenho milhares, mas só preciso ver uma delas: (vejo muitas delas, porque cada dispositivo scsi deseja inserir sua própria mensagem. Só preciso ver se está acontecendo, não se está acontecendo para cada um deles).

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

Mas eu quero ver apenas

rdac checker reports path is down: ctlr is in startup sequence

Responder1

Se várias instâncias forem consecutivas, você pode fazer:

Atualização de acordo com nova solicitação:

  • Ctrl+H
  • Encontre o que:^([^-]+- )(.+)(?:\R(?1)\2)+
  • Substituir com:$2
  • confira Envolver
  • verifique expressão regular
  • NÃO VERIFIQUE. matches newline
  • Replace all

Explicação:

^           : beginning of line
  (         : start group 1
    [^-]+-  : 1 or more NOT dash,then a dash and a space
  )         : end group 1
  (         : start group 2
    .+      : 1 or more any character
  )         : end group 2
  (?:       : start non capture group 
    \R      : any kind of linebreak
    (?1)    : same pattern than group 1 (ie. "[^-]+- ")
    \2      : backreference to group 2
  )+        : end non capture group, must appears 1 or more times.

Substituição:

$2      : content of group 2

Resultado para determinado exemplo:

rdac checker reports path is down: ctlr is in startup sequence

Se as instâncias múltiplas não forem consecutivas, é melhor escrever um script em sua linguagem de script favorita.

Aqui está um one-liner perl que faz o trabalho:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile

informação relacionada