Como posso alterar o espaço ## - ## para a guia ## - ##?

2

Eu tenho uma lista de entradas que começam com dois números, um traço, dois números e um único espaço. Por exemplo (observe o espaço após os números):

87-17 

Eu preciso alterar o acima para 87-17<tab> (onde <tab> representa um caractere de tabulação real). Eu não sei como escrever isso. Eu sei que é simples, mas eu não estou familiarizado com o Linux, eu sou apenas um humilde designer gráfico ...

    
por designMind 20.07.2015 / 17:49

4 respostas

6

Você pode usar sed :

sed -ir 's/^([0-9]{2}-[0-9]{2}) /\t/' file

Explicação

sed é um "editor de fluxo". Pense nisso como uma linguagem de programação simples projetada principalmente para editar texto. A opção -i permite editar o arquivo no lugar. Execute o comando sem o -i primeiro para garantir que ele produza o resultado desejado (o arquivo permanecerá inalterado) e execute-o com -i para manter as alterações. O -r permite extensões regulares estendidas que, neste caso, simplificam o formato.

O s/foo/bar/ é o "operador de substituição". Ele substituirá a primeira instância de foo em cada linha por bar . Aqui, estamos alimentando uma expressão regular que significa "corresponde ao início da linha ( ^ ), depois dois dígitos ( [0-9]{2} ), menos - , outros 2 dígitos e depois um espaço. Como esse padrão está dentro de parênteses, é "capturado" e disponibilizado como . Portanto, o comando irá substituí-lo por si mesmo seguido por uma tabulação ( \t ).

Ou perl :

perl -i -pe 's/(\d{2}-\d{2}) /\t/' file

Explicação

Isso é muito parecido com o sed acima, mas usando perl , outra linguagem de script. O -i tem a mesma função que para sed . O -p significa "imprimir todas as linhas depois de aplicar o script dado a -e .

O operador de substituição é novamente o mesmo apenas que aqui podemos usar a abreviatura \d para dígitos.

    
por terdon 20.07.2015 / 17:58
2

Se você tiver apenas esse espaço no final, poderá usar tr :

< file tr ' ' '\t' > file1

ou sed :

sed -i 's/ /\t/' file

Se houver outros espaços que não devem ser substituídos:

sed -i 's/ $/\t/' file
    
por kos 20.07.2015 / 17:57
1

Usando awk

  • Se você realmente tiver algo assim 87-17<space> no seu arquivo

    awk '/ $/ {printf "%s\t\n",}' foo > bar
    
  • se não

    awk '/[0-9][0-9]-[0-9][0-9] $/ {printf "%s\t\n",}' foo > bar
    

Usando gawk

Talvez seja necessário instalar gawk primeiro

sudo apt-get install gawk

Depois disso

gawk '{print gensub(/^([0-9]{2}\-[0-9]{2})\s$/,"\1\t","g")}' foo > bar

Explicação

  • ^ afirma a posição no início da string

  • 1º grupo de captura ([0-9]{2}\-[0-9]{2})

    • [0-9]{2} corresponde a um único caractere presente na lista abaixo

      Quantificador: {2} exatamente 2 vezes

      0-9 um único caractere no intervalo entre 0 e 9

    • \- corresponde ao caractere - literalmente

    • [0-9]{2} corresponde a um único caractere presente na lista abaixo

      Quantificador: {2} exatamente 2 vezes

      0-9 um único caractere no intervalo entre 0 e 9

    • \s corresponde a qualquer caractere de espaço em branco [\r\n\t\f ]

    • $ afirma a posição no final da string

por A.B. 20.07.2015 / 18:01
0

Você pode usar tr para converter caracteres. No exemplo a seguir, converti espaços para tabulação.

echo '22-12 11-12' | tr ' ' '\t'
22-12   11-12
    
por Validus Oculus 20.11.2016 / 15:11