Use o SED para remover as duas últimas linhas e a vírgula que as precede

0

Eu tenho um arquivo de texto com esta aparência:

    FD488AFF,
    FED6ECFF,
    FFA2A2FF,
    FFD7D8FF,
(
)

Isso também tem um caractere de nova linha após o último caractere ) . Estou usando o terminal macOS e procurando uma maneira de remover a última vírgula , a ( e a última ) e a > caracteres de retorno que os seguem .

,
(
)

e o caractere de nova linha após o último ) caractere, mas não consigo fazer isso funcionar. Eu não tenho que usar sed , mas ele precisa estar usando o terminal.

    
por mcbeav 20.11.2018 / 20:18

5 respostas

3

Inverta o arquivo, remova as duas primeiras linhas e remova a vírgula na terceira linha. Em seguida, reverta os resultados.

tac file | sed '1,2d; 3s/,$//' | tac

Para voltar ao mesmo arquivo:

... | tac > tmp && mv tmp file

ou, usando sponge do pacote moreutils :

... | tac | sponge file

Pensando bem, esta será uma ótima maneira de fazê-lo: ed é na verdade um editor de arquivos para que você possa fazer suas edições e salvar.

ed file <<'END'
$-1,$d
$s/,$//
wq
END
    
por 20.11.2018 / 21:54
2

Não é o mais eficaz, mas deve fazer o trabalho:

sed '$d' file | sed '$d' | sed '$s/,$//'
    FD488AFF,
    FED6ECFF,
    FFA2A2FF,
    FFD7D8FF
    
por 20.11.2018 / 22:33
0

Não tenho certeza de uma maneira de fazer isso com um comando sed pois você deseja remover o último, mas não é a última linha. Aqui está uma maneira que eu encontrei para fazer isso usando um pipe:

sed -e '/^[()]/d' _file_ | sed -e '$s/,$//'

O primeiro sed remove as linhas que começam com (ou). O segundo sed remove a vírgula no final de uma linha apenas da última linha.

Espero que isso ajude.

    
por 20.11.2018 / 20:48
0

Para remover as duas últimas linhas, se elas contiverem um parente à esquerda e um parente à direita, e a vírgula que os precede, use uma janela deslizante:

sed  '1N;$!N;${
s/,\n(\n)//
}
P;D' infile

Isso extrai uma linha N ew quando na linha 1 st e, em seguida, mantém sempre três linhas no espaço padrão (por meio de um N;P;D cycle ). Quando chega à linha $ t, ele tenta 1 remover uma vírgula seguida por um \n ewline, um ( , outro \n ewline e um )

1: não há necessidade de ancorar aqui, pois não pode haver mais de três linhas no espaço padrão a qualquer momento

    
por 20.11.2018 / 21:42
-1

Para remover as últimas duas linhas pelo conteúdo

veja a resposta do @ShamM link

Para remover as últimas duas linhas por posição e a vírgula do final do terceiro até o final.

< «file-name»  head -n -2 | sed -r -e '$ s/,$//'

ou

< «file-name»  sed -nr -e 'x;${d;x;d};1d;p' | sed -r -e '$ s/,$//'
    
por 20.11.2018 / 20:55