Replacing dots (.) in sed
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
Related videos on Youtube
Rafal
Updated on September 18, 2022Comments
-
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, butM-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 about 11 yearsI'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 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 havesed
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 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 about 11 years@Rafal If you look at
cat -A sed-dots
you can see that the "spaces" between the dots are specialM-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 about 11 yearsIt does not work. I guess that reason is weird M-BM character that @Oli have found.
-
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.