Замена точек (.) В седе

Итак, актуальный вопрос - есть ли у кого-нибудь идеи, как удалить M-BM- специальный символ, не рискуя потерять другие символы?

У меня есть строка текста:

[ 110]

, то есть

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 -A myfile кажется проблемой, что эти пробелы не пробелы, а M-BM- специальный символ. Использование любого символа ., предложенного для поиска, не очень хорошая идея, так как есть риск, что некоторые другие символы будут удалены.

9
задан 3 August 2016 в 11:52

3 ответа

Попробуйте следующее, чтобы заменить все "." На "."

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

Но для "...." на "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
0
ответ дан 3 August 2016 в 11:52

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

Вы были в значительной степени там, но ваше регулярное выражение ожидало ведущего места.

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

Обратите внимание, что \s? все еще достаточно жадный, чтобы испортить вывод, поэтому я добавил пробел к выводу. Вы можете не хотеть этого. Я также сделал пробел необязательным, поэтому он будет соответствовать всем следующим параметрам:

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

Просто удалите необязательный флаг ?.


Учитывая вашу проблему с юникодом (в комментариях), вы можете принудительно привести данные к их 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
0
ответ дан 3 August 2016 в 11:52

Я мог использовать ваш файл, когда просматривал его:

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

Это работало без шага преобразования:

sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt
0
ответ дан 3 August 2016 в 11:52

Другие вопросы по тегам:

Похожие вопросы: