Colando algum texto com abas em um documento aqui em uma janela do PuTTY

3

Eu tenho uma string com dados delimitados por tabulações que se parece com:

h1  h2
a1  b1
a2  b2

Eu produzi com o Bloco de Notas no Windows. Eu criei dados delimitados por tabulações, garantindo que as guias e não os espaços sejam usados.

EuconectoaumservidorLinuxviaSSHusandooPuTTY.Gostariadegravaroarquivoem/tmp/test.txtepreservarasguias.Entãoeucorrocat<<EOF>/tmp/test.txt.EucopiootextodoBlocodeNotaseocolonasessãoputty.EntãoeudigitoEOF.

No entanto, isso produz um arquivo sem guias com o conteúdo de:

h1h2
a1b1
a2b2

Descobri que isso funciona:

sed 's/\t/\t/g' > /tmp/test.txt << EOF
h1\th2
a1\tb1
a2\tb2
EOF

No entanto, é necessário que eu mude minha string de entrada para usar '\ t' em vez de abas reais. O que é uma solução mais elegante / simples que me permite pegar uma string literal como está no Windows e gravá-la em um arquivo na máquina Linux remota?

Eu sou SSHed em um servidor Linux do Windows via putty. O servidor é:

  • Distribuição: Servidor Red Hat Enterprise Linux versão 6.6 (Santiago)
  • Versão do Bash: 4.1.2 (1) -release (x86_64-redhat-linux-gnu)
  • cat: coreutils-8.4-37.0.1.el6.x86_64
por Elijah W. Gagne 08.06.2015 / 23:03

3 respostas

3

Quando você digita em um shell, o shell reconhece alguns caracteres como comandos. Por exemplo, o caractere de retorno de carro (o caractere enviado pela tecla Enter ) faz com que o shell execute o comando. O caractere de tabulação faz com que o shell execute a conclusão. Quando você cola algo na janela do terminal do PuTTY, do ponto de vista do shell, é a mesma coisa que se você tivesse digitado esses caracteres. Então, no ponto em que o caractere de tabulação é colado, o shell executa a conclusão, ele não insere uma guia.

A maneira mais fácil de copiar um arquivo sem transformá-lo seria usar o programa PSCP ou PSFTP do PuTTY para copiar o arquivo. Esta é a maneira mais simples conceitualmente, mas tem a sobrecarga de executar outro programa, autenticando, escolhendo um diretório, etc.

Se você quiser algo inline, cole diretamente em cat , em vez de em um documento here. Então você estaria colando no editor de linhas do terminal, não no editor de linha do shell. Como o editor de linha do terminal é muito primitivo, apenas alguns caracteres de controle têm um significado especial, não incluindo a guia. Pressione Ctrl + D no início de uma linha para terminar a entrada.

[darkstar /]$ cat >text.txt
Paste
Ctrl+D
[darkstar /]$ 

Se você deseja transferir dados arbitrários em um meio que interpreta caracteres de controle, você pode codificá-los em um formato que use apenas caracteres "domar". Base64 é um deles; ele não usa nenhum caractere de controle e ignora espaços em branco e novas linhas. O GNU coreutils, que faz parte da instalação básica no Linux e no Cygwin, inclui um base64 comando . No lado do remetente, execute base64 <file-to-decode , por exemplo,

  • No Windows: execute base64 c:/path/to/test.txt a partir de um terminal Cygwin
  • Copie a saída.
  • No shell da janela PuTTY, digite 'base64 -d > /tmp/test.txt e pressione Enter .
  • Cole a saída de base64 .
  • Pressione Ctrl + D .
por 11.06.2015 / 19:42
1

Não tenho certeza do problema que você está tendo - na instalação do RHEL, cat funciona se eu der paradas de tabulação. No entanto, como uma solução mais geral, talvez:

 #!/usr/bin/perl

 use strict;
 use warnings; 

 while ( <> ) { 
     s/\s+/\t/g; 
     print;  
 }

Receberá 'entrada' em STDIN (catted into) ou como nomes de arquivos (por exemplo, myscript.pl <filename> ) e converterá todos os espaços em branco em paradas de tabulação.

    
por 09.06.2015 / 14:02
1

Se você quiser uma solução mais simples que perl script , você pode usar o sed, de qualquer forma, perl script também é simples.

echo "hello    world" | sed 's/\(\t\+\)/\t/g'

De qualquer forma, usando redhat 5 não vejo nenhum problema usando o comando cat

rpm -qf $(which cat)
coreutils-5.97-34.el5
    
por 09.06.2015 / 14:31