Заміна крапок (.) В sed


9

Тож актуальне питання - чи має хтось ідея, як видалити M-BM-спеціальний персонаж, не ризикуючи втратити інших персонажів?

У мене є рядок тексту:

" . . ."

це є

space dot space dot space dot

Я намагаюся замінити всю появу цього рядка в текстовому файлі на

"..."

це є

dot dot dot

Я намагався зробити з sed:

sed -r 's:\s\.\s\.\s\.:...:g' -i sed-dots

На жаль, він навіть трохи не змінює вхідний файл. Файл: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

Коли я намагаюся замінити один і той же рядок у текстовому редакторі (я використовую geany), він знайдений та замінений належним чином.

Єдина причина, про яку я можу подумати - це те, що деякі (або всі) з цих просторів насправді не простори, а якийсь особливий характер.

Хтось має ідею, як знайти та замінити цей рядок на sed (або будь-який інший інструмент командного рядка)? Будь ласка, протестуйте свою ідею на моєму файлі, оскільки проблема не настільки очевидна, як може здатися - саме тому я запитав про це.

Після використання cat -Amyfile видається проблемою те, що ці простори - це не пробіли, а M-BM-особливий символ. Використання будь-якого символу, .запропонованого для пошуку, не є хорошою ідеєю, оскільки є ризик, що деякі інші символи будуть видалені.

Відповіді:


10

Спершу я б почав з тестування echoта sedпідключення до цього , ніж із використання реального файлу. По-друге, ви можете використовувати {n}в розширеній моделі регулярних виразів для позначення кратних і обмежень.

Вас було там багато, але ваш регекс очікував провідного місця.

$ echo 'cheese . . . muffins' | sed -r 's/(\s?\.){3}/ dot dot dot/g'
cheese dot dot dot muffins

Зауважте, що \s?це все ще досить жадібно, щоб зруйнувати висновок, тому я додав пробіл у вихід. Можливо, ви цього не хочете. Я також зробив пробіл необов’язковим, тому він відповідатиме всім наступному:

...
. ..
.. .
. . .
 . . . 

Просто видаліть необов'язковий ?прапор.


З огляду на ваші проблеми з unicode (у коментарях), ви можете примусити дані до їх відповідності ASCII iconvі потім подати їх:

$ iconv -f utf-8 -t ascii//translit sed-dots | sed -r 's/(\s?\.){3}/ dot dot dot/g'
Lorem ipsum dot dot dot
Some dot dot dot more text

Я здивований, що ви рекомендуєте використовувати echoзамість того, щоб вибирати файл, принаймні, коли ви котуєте файл, ви знаєте, що оболонка нічого не інтерпретує, а також не відлуння.
Flimm

@Flimm для простого прикладу з крапками, це насправді не проблема. Якщо ви збираєтеся завантажувати з файлу, не турбуйтеся cat- просто sedзавантажте файл (за прикладом ОП), але не зберігайте вбудований (видаліть -i, щоб ви могли бачити і перевіряти на вихід).
Олі

@Oli Це працює з вашим прикладом, але це не працює з моїм файлом (у моєму питанні є посилання). Це проблема - ваша команда та інші повинні працювати, але вони не мають, оскільки є певна проблема з цими крапками. Перевірте свою команду на моєму файлі, і ви побачите, що вона не працює.
Рафал

1
@Rafal Якщо ви подивитесь, cat -A sed-dotsви можете побачити, що "пробіли" між точками є спеціальними M-BM- символами ... Не впевнені, як вони там прокралися, але їх потрібно замінити. Якщо ви не можете їх добре націлити, це працює: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
Олі

@Oli Це працює. Дуже дякую! Чи можете ви пояснити синтаксис? Ви впевнені, що він не має жодних побічних ефектів і не замінить нічого іншого? Наскільки я бачу, цей RegExp буде відповідати будь-якому символу після крапок. Однак M-BM - це не один персонаж, це три. То як це можливо спрацює?
Рафал

0

Спробуйте виконати наступне, щоб замінити всі "." На "."

sed -r 's/\. /\./g' -i sed-dots

Крім ". . ." до "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots

0

Я міг би використати ваш файл, коли запустив його:

tr '\240' ' ' < sed-dots.txt > sed-dots.new

Це спрацювало без кроку конверсії:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt

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