remove todo o texto após um determinado caractere que aparece em linhas ímpares

2

remove todo o texto depois de um determinado caracter que aparece em todas as linhas ímpares

isso funciona para todas as linhas no arquivo com sed

sed 's/;.*//' 

como editar essa linha sed, então ela faz todas as linhas ímpares

    
por bob 21.08.2017 / 16:23

2 respostas

3

Com o GNU sed :

$ sed '1~2s/;.*//' file

O intervalo de endereços 1~2 corresponderá à linha 1 e depois a todas as segundas linhas depois disso. O caso geral é first~step e o exemplo no manual é sed -n 1~2p , que imprimirá todas as linhas ímpares.

Esta é uma extensão do GNU.

O equivalente em awk :

$ awk 'NR % 2 { sub(";.*", "") } { print }' file

Ou, como sugerido por Arrow nos comentários:

$ awk -F';' 'NR % 2 { $0 = $1 } { print }' file

que tem o mesmo efeito, mas em vez de substituir explicitamente tudo após o primeiro ; , usa ; como o separador de campo (com -F';' ) e, em seguida, gera apenas o primeiro campo (substituindo toda a entrada linha com apenas o primeiro campo para linhas ímpares).

    
por 21.08.2017 / 16:28
3

Isso provavelmente funcionará com todas as versões sed , testadas em GNU sed embora

$ cat ip.txt 
foo;bar-baz;xyz
a;b;c
good bad. hi there
d;e
cool;hot;normal

$ sed 's/;.*//;n' ip.txt 
foo
a;b;c
good bad. hi there
d;e
cool

O comando n buscará a próxima linha, mas não alterará nada, permitindo efetivamente alterar apenas linhas ímpares


Com perl

perl -pe 's/;.*// if $.%2' ip.txt

onde if $.%2 adiciona condição para executar a substituição apenas se o número da linha for ímpar

    
por 21.08.2017 / 16:36

Tags