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


8

Fui surpreendido com este problema aparentemente simples de corrigir ... bem, por um tempo.

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

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

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 SOMENTE 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, o que não é o que eu preciso ..

Eu tentei alguns loops bastante ridículos com grep e sedmas nada parece funcionar da maneira certa.

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á a minha saída desejada:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR

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 o GNU sedfor -r, use -Enos BSDs):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename

Perfeito! Era exatamente isso que eu estava procurando! Não foi possível encontrar a sintaxe em nenhum lugar da parte "/ [0-9] /! S /". Muito obrigado.
user62129

@ user62129 - se esta resposta resolver seu problema, reserve um minuto e marque a caixa de seleção abaixo da contagem de votos à esquerda, isso significa para todos que o problema foi resolvido.
Slm

7

Usando perl:

perl -ple 's/\s+//g unless /\d/' file

4

Para uma abordagem mais geral, remova apenas os espaços que estão entre duas letras. Dessa forma, ele pode funcionar mesmo que as linhas tenham dígitos, mas ignora os espaços ao redor dos números:

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

Que a vontade, por exemplo, transformar George and Harry 12 EURa GerogeandHArry 12 EURe ainda funcionar corretamente para os casos em seu exemplo.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.