Como posso imprimir todos os últimos n caracteres do bash?

3

Estou trabalhando com a entrada padrão ( cat ing dois arquivos juntos) e quero que todos, com exceção dos últimos 10 caracteres do resultado, passem pelo próximo comando.

Tudo que posso encontrar através da pesquisa é usar sed , awk ou tr para remover os últimos n caracteres de cada linha ou head , tail ou rev para remover n linhas. / p>

O que eu poderia usar para fazer isso a partir da saída padrão canalizada em um comando (simplesmente com um único comando)?

Exemplo:

Input:
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE() UNION ALL

Output:
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE()

Por que vale a pena, estou usando o CygWin no Windows, então ele precisa estar com ferramentas unix padrão e antigas: (

    
por Ehryk 20.04.2014 / 11:27

2 respostas

6

Você pode usar head :

command | head -c-10

removeria os últimos 10 bytes da saída command .

Citações de man head :

   -c, --bytes=[-]K
          print the first K bytes of each  file;  with  the  leading  '-',
          print all but the last K bytes of each file

Como você mencionou especificamente que os 10 caracteres a serem removidos ocorreriam em uma linha, você poderia usar sed também. Canalize a saída do comando para:

sed '$s/\(.\{10\}\)$//'

ou se o seu sed suportar regex estendido:

sed -r '$s/.{10}$//'

A sintaxe seria semelhante usando perl :

perl -pe 's/.{10}$// if eof'
    
por 20.04.2014 / 11:33
3

Você deve usar perl :

$ perl -lpe '$_=substr($_,0,-10) if eof' file
SELECT 'A', 1, GETDATE() UNION ALL
SELECT 'B', 2, GETDATE() UNION ALL
...
SELECT 'Z', 2, GETDATE()
    
por 20.04.2014 / 11:51