Замініть всі випадки двох пробілів після закінчення речення лише одним пробілом


9

Я застряг у включенні регулярних виразів із командою sed.

З: Я хочу замінити всі випадки двох пробілів після закінчення речення просто один раз пробілом.

Ось що я зробив:

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

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

Вихід я отримую:

This is the output.  Hello Hello

Я хочу отримати:

This is the output. Hello Hello

@Rahul Я хочу, щоб висновок, який містить один раз пробіл після закінчення речення. Не два пробіли, як у першому реченні. Я хочу вивести друге речення
Зевс

Відповідь @Jasen правильна. BTW, команда, яку ви спробували, означає: Замініть рядок, що складається лише з одного простору пробілів, порожнім рядком. Ось чому воно не робило того, що ти хотів.
rexkogitans

1
Вставте сюди: війна на одинарному та подвійному просторі після повної зупинки
Герріт

@gerrit Ця війна була втрачена 20 років тому. ;)
h4ckNinja

Відповіді:


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

замініть крапку, а потім два чи більше пробілів крапкою, а за ними - один пробіл.


Ваша команда насправді працює на весь абзац. Саме цього я хотів. Дякую!
Зевс

або 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)
cas

13

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

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

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

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


1
можна скоротити доsed -r 's/([.?!])\s+/\1 /g' file
Sundeep

Дякую. Але ви б ласкаво розібралися, чому використовували стільки круглих, квадратних дужок? Це мало заплутано.
Зевс

1
@spasic: Це робота лише з GNU sed, оновлена ​​спрощена версія.
cuonglm

@Zeus: Це стандартний синтаксис із BRE за замовчуванням.
cuonglm

1
Ні, оригінальний sedсценарій редагування замінить будь-який рядок, що містить єдиний пробіл, з буквальним рядком ^$.
Kusalananda

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
Мені не було відомо про цю особливість тр.,
Ясен

3
Цей підхід замінить два пробіли, які також не є закінченням речення.
cuonglm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.