Home > Software design >  In bash, why does it output a right bracket as a value in when replacing?
In bash, why does it output a right bracket as a value in when replacing?

Time:01-26

So I was looking into tr and I was playing around with the following command: echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n*]' vs echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n]'. These are the different outputs:

> echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n*]'
test




new
LINE
> echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n]'
test]]]]]new]LINE]

Without the addition of the wildcard, it appears to be replacing each new line with a right bracket character. Taking a look at the man page (https://linuxcommand.org/lc3_man_pages/tr1.html), it says that for the argument [CHAR*], it "in SET2, copies of CHAR until length of SET1". So clearly it still replaces characters in SET1 based on SET2 but where is it getting the right bracket from?

Nothing to do with my job so no need to tell me about sed or awk, just came across this and was curious.

CodePudding user response:

In your second command, the replacement set is not in one of the special formats

[CHAR*]
[CHAR*REPEAT]
[:<keyword>:]
[=CHAR=]

So it doesn't get any special treatment and the square brackets are treated literally. So the first two non-alphabetic characters are replaced with [ and \n, respectively, and all other characters are replaced with ] (because the replacement set is extended by repeating the last character).

  • Related