On Mon, Jul 07, 2014 at 09:30:20AM +0300, Niko Tyni wrote: > echo "$1" | sed 's/\([^a-zA-Z0-9.:_\-\/]\)/\\\1/g' ;; > > should possibly be > > echo "$1" | sed 's/\([^a-zA-Z0-9.:_\/-]\)/\\\1/g' ;;
(My, what a mess.) To expand on this a bit, the (GNU) sed manual states in the 'Regular Expressions' chapter: to include `-' in the list, make it the first or last and The characters `$', `*', `.', `[', and `\' are normally not special within LIST. For example, `[\*]' matches either `\' or `*', because the `\' is not special here. The forward slash ('/') should be an exception here because it's the delimiter; from the chapter 'The "s" Command': The `/' character (or whatever other character is used in its stead) can appear in the REGEXP or REPLACEMENT only if it is preceded by a `\' character. However, it looks like this doesn't apply to character lists inside the regexp at all [1]. This seems like a possible bug in the sed documentation. So sed 's/\([^a-zA-Z0-9.:_\-\/]\)/\\\1/g' quotes characters that are - not alphanumeric (a-zA-Z0-9) - not one of '.', ':', or '_' - not in the range \-\, i.e. not '\' - not '/' while the suggested 's/\([^a-zA-Z0-9.:_\/-]\)/\\\1/g' would quote characters that are - not alphanumeric - not one of '.', ':', '_', '\', '/', or '-' which is probably what was intended here. This is still relying on the delimiter having no special meaning inside a character list. I'm not sure how portable alternative delimiters are; if they are an option here an even better solution would be 's|\([^a-zA-Z0-9.:_\/-]\)|\\\1|g' [1] sed 's/[/]//g' is accepted and removes all forward slashes; sed 's/[^/]//g' is also accepted and removes everything but forward slashes -- Niko Tyni nt...@debian.org -- To UNSUBSCRIBE, email to debian-bugs-dist-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org