浅谈lisp与shell中转义字符和正则表达 (一)

来源:互联网 发布:集奥聚合怎么样 知乎 编辑:程序博客网 时间:2024/06/06 03:17

转义本身包含两个层次的含义:特殊字符--> 普通字符     普通字符-->具有特殊含义。转义字符为\

具有特殊含义的元字符"<" ">" "$" "\" "|" "&" "*" "?" ,可以通过转义字符\,单引号,双引号使它去掉特殊含义。

普通字符通过转义字符具有特殊含义,\n 表换行。\e 表esc字符


对于string的值,它会在碰见\的时候,将有特殊含义的字符转义为一个普通的字符,而\[a-z]或\[A-Z]都是维持原样,你别误解为"hello\n"它最后会输出hello和一个换行。造成这么认为的原因时上面说引号解释\。把它当成转义字符,其实这个事情你应该清楚为啥它会解释转义字符\。因为如果里面碰见$的话,你说是用变量的值呢?还是单纯的就是字符$呢?所以我们就需要有一个由特殊到普通字符的转义。而\n这种由普通到特殊的字符,只有碰到一定的函数时才会表现为制表符的功能。比如printf.

你可义发现echo命令的话,会把后面的所有字符都作为一个整体看待,如果是字符串形式,就尽量维持字面值,否则就是将他们的值拼接到一块。并且它在最后会有一个换行符输出。

字符串的值:你要清楚为什么会有字符串这种形式,因为我们就是要通过双引号尽力达到一个维持字面值的目的,这也是为啥双引号中的转义字符\仅仅实现将特殊含义字符串转义为一个普通字符串的功能,比如"\\n"它的值为\n,因为当我们读入第一个\时它会看下一个字符是什么,如果是个特殊字符就转义成普通字符,否则就尽量维持字面形式如"\n"结果同样为\n。跟这个结果对比的是下面第6个的输出情况它没有维持\n,而是输出为n。我感觉这就是需要注意的一点,这个时候它应该是连接的各个字段的值。因为你看\n的值就是n。


printf 会根据字符分割符进行字符划分,同时注意为啥第二个形式会输出换行了?因为就像上面字符串所述它必须尽量维持字面值即"hello world \n"的值为 hello world \n。所以printf看到\n会输出换行。而如果后面不是字符串时,它会在碰见\时\[a-z A-Z] -->[a-z A-Z]。记住这是加不加引号的区别。


如果多个转义字符的话,它肯定不会说跟进行迭代向前式的解析\。它是每当碰见一个\,然后把它跟后面一个字符当成一组,然后第3个跟第4个为一组求值。注意比较下面有没有双引号时的区别。



对比参考浅谈lisp与shell中转义字符和正则表达(二)

原创粉丝点击