Como ajustar o espaçamento entre caracteres seguindo uma string específica?

1

Eu tenho um arquivo grande ~/foo.txt . Milhares de linhas da forma

SIZE : X  Y

estão espalhados por todo o arquivo em que X e Y são inteiros. Meu problema é que, às vezes, os inteiros X e Y são separados por dois espaços e, às vezes, são separados por um espaço. Eu gostaria de escrever um script perl que torne o espaçamento consistente, de preferência com dois espaços. Como eu poderia fazer isso?

    
por Brian Fitzpatrick 02.12.2015 / 08:21

3 respostas

3

Você diz números inteiros, mas suspeito que você esteja falando de números positivos. Aqui está uma rápida tentativa rápida de uma solução:

sed 's/\([0-9]\+\)\s\+\([0-9]\+\)/  /g'

Há advertências aqui, como se o segundo número começasse com um sinal negativo, ou se houvesse espaços que você não deseja manipular assim, que ocorrem entre, por exemplo, a53 e 27B . Ou se você não quiser que todos os números sejam separados por dois espaços. Mas este é um começo que você pode modificar como quiser.

Relendo sua pergunta, parece que todos os espaços que você deseja "espremer" ocorrem especificamente nas linhas que começam com a palavra "TAMANHO". Isso torna muito mais simples. Você diz "outras instâncias de espaços consecutivos" que deseja preservar, mas parece que elas estão em outras linhas. Então, nesse caso, basta usar:

sed '/^SIZE/ s_\s\s\+_  _'

(Existem dois espaços no texto de substituição.)

Relendo novamente, agora vejo que você quer consertar um espaço em dois espaços. Isso fica um pouco mais dependente do formato exato de suas linhas, mas eu diria:

sed '/^SIZE/ s_\s\+_  _3'

deve fazer isso. (Ele funciona na amostra que você fornece.) O 3 faz a substituição ocorrer apenas na correspondência de \s\+ - que, como o caos explicou, significa "um ou mais espaço ou tabulação" . Então, em SIZE<space>:<space>X<space>Y , ele irá transformar o espaço entre o X e o Y em dois espaços.

    
por 02.12.2015 / 08:31
1

com sed :

sed -i 's/\([0-9]\)\s\+\([0-9]\)/  /' file
  • -i edita o arquivo no lugar.
  • [0-9] : pesquisas por um dígito.
  • \s+ : este dígito é seguido por um espaço ou tabulação.
  • [0-9] : e novamente seguido por um dígito.
  • esses dois dígitos são salvos nas referências anteriores e , que agora estão separadas por dois espaços.

Exemplo:

$ cat file
SIZE : 2  1 # 2 spaces
SIZE : 1 22 # 1 space
SIZE : 1    1 # 4 spaces
SIZE : 324  34 # a tab
SIZE : 324      34 # 2 tabs
$ sed 's/\([0-9]\)\s\+\([0-9]\)/  /' file
SIZE : 2  1
SIZE : 1  22
SIZE : 1  1
SIZE : 324  3
SIZE : 324  34
    
por 02.12.2015 / 08:31
0
sed 's/\([0-9] \) *\([-+.]*[0-9]\)/ /g' <in >out
    
por 02.12.2015 / 08:43