Substitua todas as ocorrências de dois espaços após o final de uma frase por apenas um espaço


9

Estou preso em incluir expressões regulares com um comando sed.

P: Quero substituir todas as ocorrências de dois espaços após o final de uma frase por apenas uma vez.

Aqui está o que eu fiz:

sed 's/^ $/^$/' file  

E não substituiu dois espaços por um espaço após o término da frase.

Saída que recebo:

This is the output.  Hello Hello

Saída que eu quero:

This is the output. Hello Hello

@Rahul Eu quero que a saída contenha uma vez espaço após o término da frase. Não há dois espaços como na primeira frase. Quero que a segunda saída sentença
Zeus

A resposta de @Jasen está correta. BTW, o comando que você tentou significa: Substitua uma linha que consiste em apenas um único espaço em branco por uma linha vazia. É por isso que não fez o que você queria.
Rexkogitans

1
Inserir aqui: guerra ao único vs. espaço duplo após a parada completa
Gerrit

@gerrit Essa guerra foi perdida há 20 anos. ;)
h4ckNinja

Respostas:


12
 sed 's/\.   */. /g' < file

substitua o ponto seguido por dois ou mais espaços pelo ponto seguido por um único espaço.


Seu comando realmente funciona para o parágrafo inteiro. Era exatamente o que eu queria. Obrigado!
Zeus

ou sed -r 's/\.\s+/. /g' filecom o GNU sed ...
Sundeep

uso @spasic em sed -Evez de sed -r. Isso funciona com o GNU sed e o * BSD sed (incluindo o Mac OS X) e alguns outros. Está programado para inclusão como padrão no POSIX "em breve".
cas 23/07

@cas Lembro-me de algum tempo atrás, sugeri sed -Ea alguém neste site que não funcionou, mas sed -rfuncionou .. Eu trabalhei com o GNU sed sozinho, então nenhuma idéia sobre POSIX e outras variações .. tentará incluir esses detalhes no futuro , graças :)
Sundeep

Deve ter sido uma versão antiga do GNU sed. Eles apoiado -Epor um bom tempo agora (pelo menos desde 2011, mas as páginas man e info ainda só mencionar -r)
cas

13

Seu sedcomando 's/^ $/^$/'não fará o que você deseja. Apenas substitui todas as linhas que contêm um espaço por uma linha que contém ^$.

Depende dos caracteres que marcam o final da frase, você pode fazer:

sed -e 's/\([.?!]\) \{2,\}/\1 /g' <file

Isso irá substituir 2 ou mais espaços depois ., ?ou !com apenas um espaço.


1
pode ser reduzido parased -r 's/([.?!])\s+/\1 /g' file
Sundeep

Obrigado. Mas, por favor, explique por que tantos colchetes redondos foram usados? É um pouco confuso.
Zeus

1
@spasic: Isso funciona apenas com o GNU sed, atualizado com a versão simplificada.
cuonglm

@ Zeus: Essa é a sintaxe padrão do padrão BRE.
cuonglm

1
Não, o sedscript de edição original substituirá qualquer linha que contenha um único espaço pela string literal ^$.
Kusalananda

7

É isso que você pode estar procurando,

tr -s " " <filename

Amostra,

$ echo "This is the output.  Hello Hello" | tr -s "[:blank:]"
This is the output. Hello Hello

Usando sed,

$ echo "This is the output.  Hello Hello" | sed 's/\. \+/. /g'
$ echo "This is the output.  Hello Hello" | sed 's/\. \{1,\}/. /g'
This is the output. Hello Hello

2
Bem, está funcionando, obrigado, mas preciso incluir o comando sed. Diga algo semelhante ao mostrado acima, como substituição, alteração de texto etc. no sed.
Zeus

2
Eu não estava ciente desse recurso tr,
Jasen

3
Essa abordagem substituirá dois espaços que também não terminam a frase.
cuonglm
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.