pt remove caracteres da nova linha

4

Após algum processamento, eu tenho meu arquivo de entrada como abaixo.

file1.txt

12345|john|student
43321|jack|professor

78965|alex|lecturer

Eu preciso processar o arquivo acima ainda, e também preciso de um separador de linha no final da linha. Atualmente, posso realizá-lo como abaixo.

sed 's/$/|/' file1.txt

O comando acima resulta na saída como

12345|john|student|
43321|jack|professor|
|
78965|alex|lecturer|

Como podemos ver, o | é anexado às linhas em branco também. Quando tentei remover novamente o caractere | das linhas em branco usando o comando abaixo,

sed 's/|//g' file1.txt

O caractere | está sendo excluído em todos os lugares. Como posso excluir apenas o | em linhas em branco? Eu preciso manter a linha em branco também.

    
por Ramesh 10.04.2014 / 00:48

6 respostas

2

Do original, você pode adicionar | às linhas que não estão em branco:

Usando sed :

sed -e '/^$/!s/$/|/' file

Usando perl :

perl -lpe 's/$/|/ if length' file

Se você quiser remover | das linhas em branco (na segunda versão):

perl -lpe 's/\|// if length == 1'
    
por 10.04.2014 / 04:28
3

Eu consegui fazer isso usando o comando abaixo.

sed 's/^|//' file1.txt

Basicamente, verifico apenas o primeiro caractere usando ^ e, se for | , estou excluindo-o.

    
por 10.04.2014 / 00:55
3
sed '/../!d;a\ ' file

Isso serviria perto do mesmo propósito que o abaixo; ele excluiria qualquer linha que não contenha 2 ou mais caracteres e acrescentaria um espaço em branco a todos os demais.

Isso me dá um tipo de arquivo como o seu problema:

printf '12345|john|student\n|\n|\n|\n%.0b' 'seq 1 10' >|./file1.txt

Parece assim:

12345|john|student
|
|
|

Mas repetido 10 vezes.

Então isso:

sed -n '/[^|].*/s//&|\n/p' ./file1.txt

Me dá:

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

12345|john|student|

Desculpe, demorei um pouco para fazer isso direito; Eu preciso parar de escrever essas respostas no meu telefone ...

    
por 10.04.2014 / 16:40
2

Apenas anexe um | para uma linha com pelo menos um caractere:

sed 's/\(.\)$/|/' file1.txt
    
por 10.04.2014 / 12:45
1

com sed :

sed -i~ -re 's/^\|$//' file

Pesquisa ^ início da linha um canal \| e fim da linha $ . // exclui o caractere. Edite o arquivo no lugar com -i~ e crie um backup file~ .

    
por 10.04.2014 / 05:36
0

A partir do comando em questão, você pode remover a opção g (recursiva) e adicionar o caractere de chapéu ^ antes do pipe para verificar apenas o primeiro caractere:

sed 's/^|//' file1.txt
    
por 11.04.2014 / 19:51

Tags