Итак, актуальный вопрос - есть ли у кого-нибудь идеи, как удалить 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-
специальный символ. Использование любого символа .
, предложенного для поиска, не очень хорошая идея, так как есть риск, что некоторые другие символы будут удалены.
Попробуйте следующее, чтобы заменить все "." На "."
sed -r 's/\. /\./g' -i sed-dots
Но для "...." на "..."
sed -r 's/\. \. \./\.\.\./g' -i sed-dots
Сначала я бы начал с тестирования с 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
Я мог использовать ваш файл, когда просматривал его:
tr '\240' ' ' < sed-dots.txt > sed-dots.new
Это работало без шага преобразования:
sed 's/[[:blank:]]\.[[:blank:]]\.[[:blank:]]\./.../g' sed-dots.txt