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
Zeus
fonte
@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.

Jasen
fonte
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.

cuonglm
fonte
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
Rahul
fonte
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