Como remover um caractere específico em uma string, mas somente se não houver números nessa linha no Linux

8

Eu fiquei perplexo com esse problema aparentemente simples de corrigir ... bem, por um tempo.

Aqui está o exemplo de saída do arquivo que eu preciso editar:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Eu preciso remover os espaços entre "George Washington" e "Convenção de Genebra", mas não os espaços entre "123,281,029 USD" ou "342,019,929 EUR".

Essencialmente, meu objetivo aqui é remover apenas o espaço entre as palavras em uma linha APENAS se não houver números nessa linha.

Eu tentei editar o arquivo via grep -v [0-9] $file | sed 's/ //' , mas a única maneira que funcionará é se eu enviar para outro arquivo, mas isso significaria excluir todas as linhas com números do arquivo antigo para o novo arquivo, que é não o que eu preciso ..

Eu tentei alguns loops bem ridículos com grep e sed , mas nada parece funcionar corretamente.

Novamente, aqui está o exemplo de saída do arquivo:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

Aqui está minha saída desejada:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR
    
por user62129 06.03.2014 / 19:08

3 respostas

15

Usando sed :

sed '/[0-9]/!s/ //g' filename

Isso removeria espaços em todas as linhas que não contêm um dígito.

Usando awk :

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

Para remover o espaço apenas entre as duas primeiras palavras (aqui usando GNU sed para -r , use -E em vez de BSDs):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)//' filename
    
por 06.03.2014 / 19:13
7

Usando perl :

perl -ple 's/\s+//g unless /\d/' file
    
por 06.03.2014 / 19:14
4

Para uma abordagem mais geral, remova apenas os espaços entre duas letras. Dessa forma, pode funcionar mesmo que as linhas tenham dígitos, apenas ignora os espaços em volta dos números:

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

Isso, por exemplo, transformará George and Harry 12 EUR em GerogeandHArry 12 EUR e ainda funcionará corretamente para os casos em seu exemplo.

    
por 07.03.2014 / 06:51