Como faço para remover todos, exceto a última ocorrência de uma string?

2

Estou tentando remover todas as ocorrências de 2016/01/30 14:52:51: , mas a última. Eu tentei isso:

awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

para substituir todos, exceto a última ocorrência, por nada, mas que apenas duplicou 2016/01/30 14:52:51: 4 vezes com números ligeiramente diferentes.

    
por DisplayName 30.01.2016 / 15:07

2 respostas

3

Há mais de um problema com o script, além disso, a declaração do problema precisa de alguns esclarecimentos:

  • a chamada gsub tem a expressão regular no parâmetro errado
  • atualizar $1 não tem efeito em $0 (o valor usado na instrução print )
  • OP não esclareceu se a intenção era deixar a última ocorrência em uma linha intocada, ou apenas a última linha contendo a data (a última é mais provável).

Aqui está um script que incorpora essas correções e suposições:

#!/bin/sh
awk '
BEGIN { row=0; fixup = -1; }
{
    before[row] = $0;
    gsub("2016/01/30 14:52:51: ", "", $0);
    if ( $0 != before[row] ) {
            fixup = row;
    }
    after[row++] = $0;
}
END {
    if (fixup >= 0) {
            after[fixup] = before[fixup];
    }
    for (n = 0; n < row; ++n) {
            print after[n];
    }
}
'

(usar dois arrays é menos eficiente, mas permite modificações adicionais com menos esforço do que sem o array before ).

Eu testei isso fazendo um arquivo de entrada ( foo.in ):

1awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
2awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
3awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'

e executando o script assim:

./foo <foo.in

e obtivemos

1awk '{gsub(//,"",$1);print}'
2awk '{gsub(//,"",$1);print}'
3awk '{gsub(//,"",$1);print}'
4awk '{gsub(//,"2016/01/30 14:52:51: ",$1);print}'
    
por 30.01.2016 / 16:17
2

Minha contribuição é uma alternativa ao formato POSIX para o AWK de Thomas Dickey; faz as mesmas suposições:

printf '%s\n' '1;?2016/01/30 14:52:51: ?' '1,.-g//s///' w q | ed filename
A capacidade do

ed de percorrer o arquivo para trás faz com que o trabalho seja curto.

    
por 03.02.2016 / 20:37