Заменить все вхождения двух пробелов после конца предложения только одним пробелом

9

Я застрял в том числе регулярных выражений с помощью команды sed.

Q: Я хочу заменить все вхождения двух пробелов после конца предложения только одним пробелом.

Вот что я сделал:

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

И он не заменил два пробела одним пробелом после окончания предложения.

Вывод получаю:

This is the output.  Hello Hello

Вывод хочу

This is the output. Hello Hello
Зевс
источник
@Rahul Я хочу, чтобы выходные данные содержали один пробел после окончания предложения. Не два пробела, как в первом предложении. Я хочу вывод второго предложения
Зевс
Ответ @Jasen правильный. Кстати, команда, которую вы попробовали, означает: заменить строку, состоящую только из одного пробела, пустой строкой. Вот почему он не сделал то, что вы хотели.
Rexkogitans
1
Вставьте сюда: война против одиночного и двойного пробела после полной остановки
геррит
@gerrit Эта война была проиграна около 20 лет назад. ;)
h4ckNinja

Ответы:

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

замените точку, за которой следуют два или более пробелов, за точкой, за которой следует один пробел.

Jasen
источник
Ваша команда фактически работает для всего параграфа. Это именно то, что я хотел. Спасибо!
Зевс
или sed -r 's/\.\s+/. /g' fileс GNU sed ...
Sundeep
@ spasic использовать, sed -Eа не sed -r. Это работает с GNU sed и * BSD sed (включая Mac OS X) и некоторыми другими. Это запланировано для включения в качестве стандарта в POSIX "очень скоро сейчас".
Cas
@cas Я помню, как-то назад, я предложил sed -Eкому-то на этом сайте, который не работал, но sed -rработал .. Я работал только с GNU sed, так что понятия не имею о POSIX и других вариациях .. Попробую включить эту деталь в будущем Спасибо :)
Sundeep
Должно быть, это была старая версия GNU sed. Они поддерживали в -Eтечение достаточно долгого времени (по крайней мере, с 2011 года, но страницы о -r
людях
13

Ваша sedкоманда 's/^ $/^$/'не будет делать то, что вы хотите. Он просто заменяет все строки содержит один пробел на строку содержать ^$.

В зависимости от того, какие символы обозначают конец предложения, вы можете сделать:

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

Это будет заменить 2 или более пробелов после ., ?или !только с одним пробелом.

cuonglm
источник
1
может быть сокращено доsed -r 's/([.?!])\s+/\1 /g' file
Sundeep
Спасибо. Но не могли бы вы пояснить, почему вы использовали столько круглых квадратных скобок? Это немного сбивает с толку.
Зевс
1
@spasic: Это работает только с GNU sed, обновлено в упрощенной версии.
cuonglm
@Zeus: это стандартный синтаксис с BRE по умолчанию.
cuonglm
1
Нет, оригинальный sedсценарий редактирования заменит любую строку, содержащую один пробел, литеральной строкой ^$.
Кусалананда
7

Это то, что вы можете искать,

tr -s " " <filename

Образец,

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

Используя 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
Ну, это работает, спасибо, но мне нужно включить команду sed. Пожалуйста, скажите что-нибудь похожее на показанное выше, например, подстановка, изменение текста и т. Д. В sed.
Зевс
2
Я не знал об этой функции,
Jasen
3
Этот подход заменит два пробела, которые также не являются концом предложения.
cuonglm