Replacing dots (.) in sed

29,962

Solution 1

First I would start by testing with echo and piping that into sed, than using a real file. Secondly, you can use a {n} in the extended regex model to denote multiples and limits.

You were pretty much there but your regex expected a leading space.

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

Note the \s? is still greedy enough to ruin the output, so I've added a space to the output. You might not want that. I've also made the space optional, so it'll match all of the following:

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

Just remove the optional ? flag.


Given your problem with unicode (in the comments) you can force the data to its ASCII equivalence with iconv and then sed it:

$ 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

Solution 2

Try the following to replace all ". " to "."

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

But for ". . ." to "..."

sed -r 's/\. \. \./\.\.\./g' -i sed-dots
Share:
29,962

Related videos on Youtube

Rafal
Author by

Rafal

Updated on September 18, 2022

Comments

  • Rafal
    Rafal over 1 year

    So actual question is - does anyone have an idea how to remove M-BM- special character without risking losing other characters?

    I have a string of text:

    " . . ."
    

    that is

    space dot space dot space dot
    

    I am trying to replace all occurence of this string in text file to

    "..."
    

    that is

    dot dot dot
    

    I was trying to do with sed:

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

    Unfortunately, it does not change input file even a bit. File: https://www.dropbox.com/s/46zmiruy3ln85a1/sed-dots

    When I try to do replace same string in text editor (I use geany) it is found and replaced properly.

    Only reason I can think of is that some (or all) of those spaces are not really spaces, but some special character.

    Does anyone have idea how to find and replace that string with sed (or any other command line tool)? Please test your idea on my file, as problem is not as obvious as it might seem to be - this is why I asked about it.

    After using cat -A myfile it seems problem that those spaces are not spaces, but M-BM- special character. Using any symbol . suggested for search is not a good idea as there is risk some other characters will be removed.

  • Flimm
    Flimm about 11 years
    I'm surprised that you recommend using echo instead of catting a file, at least when you cat a file, you know the shell is not interpreting anything, and neither is echo.
  • Oli
    Oli about 11 years
    @Flimm for a simple example with dots, this isn't really an issue. If you're going to load from a file, don't bother with cat - just have sed load the file (per the OP's example) but don't save inline (remove -i, so you can see and test against the output).
  • Rafal
    Rafal about 11 years
    @Oli It works with your example, but it does not work with my file (in my question, there is a link). That is problem - your command and others should work, but they don't as there is some problem with those dots. Please test your command on my file and you will see that it does not work.
  • Oli
    Oli about 11 years
    @Rafal If you look at cat -A sed-dots you can see that the "spaces" between the dots are special M-BM- characters... Not sure how they crept in there but they need replacing. If you can't target them well, this works: sed -r 's/(\s\..\..\.)/ dot dot dot/ig' sed-dots
  • Rafal
    Rafal about 11 years
    It does not work. I guess that reason is weird M-BM character that @Oli have found.
  • Oli
    Oli about 11 years
    @Rafal I've found a way to replace the unicode and I've added it to my answer. Works with your test file.