br referência anterior: obtenha cada linha e anexe-a ao final da linha

0

Eu tenho um arquivo com o seguinte conteúdo:

$ cat -n w
     1  Smith   John    12345   jsmith
     2  Jones   Robert  23456   rjones
     3  Green   Ralph   34567   rgreen
     4  Brown   Fred    45678   fbrown
     5  Orange  Mabel   56789   morang

Eu quero pegar cada linha e, em seguida, anexar no final dessa linha o mesmo texto dessa linha.

Exemplo eu quero esta saída:

$ cat -n w
     1  Smith   John    12345   jsmith  Smith   John    12345   jsmith
     2  Jones   Robert  23456   rjones  Jones   Robert  23456   rjones
     3  Green   Ralph   34567   rgreen  Green   Ralph   34567   rgreen
     4  Brown   Fred    45678   fbrown  Brown   Fred    45678   fbrown
     5  Orange  Mabel   56789   morange Orange  Mabel   56789   morange

Eu examinei o comando sed com backreferencing, mas não consigo trabalhar

$ sed 's/(.*)/\t/' wider
sed: -e expression #1, char 12: invalid reference  on 's' command's RHS
    
por Saad A 24.02.2016 / 16:19

3 respostas

2

sed use BRE por padrão, você precisa escapar de \(...\) para capturar a correspondência:

LC_ALL=C sed 's/\(.*\)/\t/' <file

ou usando -E para ativar ERE (que está disponível no GNU sed e BSD sed, e se tornará padrão em breve), então você não deve escapar (...) :

LC_ALL=C sed -E 's/(.*)/\t/' <file

A configuração da localidade como C ajuda você a corresponder a caracteres unicode inválidos.

Mas, é um trabalho melhor para paste :

paste file file

ou awk :

awk '{printf "%s\t%s\n", $0, $0}' <file
    
por 24.02.2016 / 16:26
1

Tente isto:

sed 's/\(.*\)/\t/' <filename>
    
por 24.02.2016 / 16:21
0

se você não tem nada contra o uso do awk, aqui está uma maneira de fazer isso:

awk '{print $0"\t"$0}'
    
por 24.02.2016 / 16:28