Remplacer toutes les occurrences de deux espaces après la fin d'une phrase par un seul espace

9

Je suis coincé dans l'inclusion d'expressions régulières avec une commande sed.

Q: Je veux remplacer toutes les occurrences de deux espaces après la fin d'une phrase par une seule fois.

Voici ce que j'ai fait:

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

Et il n'a pas remplacé deux espaces par un espace après la fin de la phrase.

Sortie que j'obtiens:

This is the output.  Hello Hello

Sortie que je veux:

This is the output. Hello Hello
Zeus
la source
@Rahul Je veux que la sortie contenant une fois l'espace après la fin de la phrase. Pas deux espaces comme dans la première phrase. Je veux la sortie de la deuxième phrase
Zeus
La réponse de @Jasen est correcte. BTW, la commande que vous avez essayée signifie: Remplacez une ligne composée d'un seul espace blanc par une ligne vide. C'est pourquoi il n'a pas fait ce que vous vouliez.
rexkogitans
1
Insérer ici: la guerre contre le simple contre le double espace après le point
final
@gerrit Cette guerre a été perdue il y a une vingtaine d'années. ;)
h4ckNinja

Réponses:

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

remplacer le point suivi de deux ou plusieurs espaces par un point suivi d'un seul espace.

Jasen
la source
Votre commande fonctionne en fait pour tout le paragraphe. C'est exactement ce que je voulais. Merci!
Zeus
ou sed -r 's/\.\s+/. /g' fileavec GNU sed ...
Sundeep
utilisation @spasic sed -Eplutôt que sed -r. Cela fonctionne avec GNU sed et * BSD sed (y compris Mac OS X) et quelques autres. Il est prévu de l'inclure en standard dans POSIX "très bientôt maintenant".
cas
@cas Je me souviens qu'il y a quelque temps, j'ai suggéré sed -Eà quelqu'un sur ce site qui n'a pas fonctionné mais qui a sed -rfonctionné .. J'ai travaillé avec GNU sed seul, donc aucune idée sur POSIX et d'autres variantes .. va essayer d'inclure ce détail à l'avenir , merci :)
Sundeep
Ce devait être une ancienne version de GNU sed. Ils ont pris en charge -Edepuis un certain temps maintenant (depuis au moins 2011, mais les pages man et info ne mentionnent toujours que -r)
cas
13

Votre sedcommande 's/^ $/^$/'ne fera pas ce que vous voulez. Il suffit de remplacer toutes les lignes contient un espace par un contenant de ligne ^$.

Selon les caractères qui marquent la fin de la phrase, vous pouvez faire:

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

Cela remplacera 2 espaces ou plus après ., ?ou !avec un seul espace.

cuonglm
la source
1
peut être raccourci àsed -r 's/([.?!])\s+/\1 /g' file
Sundeep
Merci. Mais voudriez-vous bien expliquer pourquoi tant de crochets ronds et carrés que vous avez utilisés? C'est peu déroutant.
Zeus
1
@spasic: Cela fonctionne uniquement avec GNU sed, mis à jour avec une version simplifiée.
cuonglm
@Zeus: C'est la syntaxe standard avec BRE par défaut.
cuonglm
1
Non, le sedscript d'édition d' origine remplacera toute ligne contenant un seul espace par la chaîne littérale ^$.
Kusalananda
7

C'est ce que vous cherchez peut-être,

tr -s " " <filename

Échantillon,

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

Utilisation 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
la source
2
Eh bien, cela fonctionne grâce, mais je dois inclure la commande sed. Veuillez dire quelque chose de similaire à celui indiqué ci-dessus, comme la substitution, changer le texte, etc. dans sed.
Zeus
2
Je n'étais pas au courant de cette fonctionnalité tr,
Jasen
3
Cette approche remplacera également deux espaces qui ne sont pas en fin de phrase.
cuonglm