On 12/11/23, Greg Wooledge <g...@wooledge.org> wrote: > 1) Many implementations of echo will interpret parts of their argument(s), > in addition to processing options like -n. If you want to print a > variable's contents to standard output without *any* interpretation, > use printf. > > printf %s "$myvar" > printf '%s\n' "$myvar" >
I will use "printf ..." from now on. > 2) As tomas already told you, the square brackets in > > tr -c -s '[A-Za-z0-9.]' _ > > are literal. You're using a command which will keep left and right > square brackets in the input, *not* replacing them with underscores. > This may not be what you want. My mistake, even though it didn't get in the way of what I was trying to do. I replaced :alnum: by what I thought it meant and left the brackets. > 3) In locales other than C or POSIX, ranges like A-Z are *not* necessarily > synonyms for [:upper:]. As I've already mentioned, GNU tr is known to > contain bugs, so you're getting lucky here. The bugs in GNU tr happen > to work the way you're expecting, so that A-Z is treated like [:upper:] > when it should not be. If at some point in the future GNU tr is fixed > to conform to POSIX, your script may break. > > The correct tr command you should be using if you want to retain > accented letters (as defined in your locale) is: > > tr -c -s '[:alnum:].' _ > > If you want to discard accented letters, then either of these is OK: > > LC_COLLATE=C tr -c -s '[:alnum:].' _ > LC_COLLATE=C tr -c -s 'A-Za-z0-9.' _ > I like your second one liner much better (LC_COLLATE=C tr -c -s 'A-Za-z0-9.' _) I tend to avoid '[:alnum:].' because the intended meaning of "ALphabetic et NUMeric" characters, even though it depends on the locale has a strong ASCII accent to it. > Thus, we come full circle. Yes, we did. Thank you, lbrtchx