shell 在bash中,为什么在替换时输出一个右括号作为中的值?

5kgi1eie  于 2023-01-26  发布在  Shell
关注(0)|答案(1)|浏览(115)

所以我在研究tr,并尝试使用以下命令:echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n*]'echo "test 123 new LINE" | tr -c 'A-Za-z' '[\n]'。以下是不同的输出:

> 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]

如果不添加通配符,它似乎会将每一个新行替换为一个右括号字符。看一下手册页(https://linuxcommand.org/lc3_man_pages/tr1.html),它说对于参数[CHAR*],它“在SET2中,复制CHAR直到SET1的长度”。因此,很明显,它仍然基于SET2替换SET1中的字符,但它从哪里获得右括号?
与我的工作无关,所以没有必要告诉我关于sed或awk的事情,只是偶然发现了这个,很好奇。

whitzsjs

whitzsjs1#

在第二个命令中,替换集不是特殊格式

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

因此,它不会得到任何特殊处理,方括号会按原样处理,所以前两个非字母字符分别替换为[\n,所有其他字符替换为](因为替换集通过重复最后一个字符来扩展)。

相关问题