Week01 Regular Expression
-
" "
中可以引用变量,而' '
中不可以引用变量。单引号和双引号的作用都是组织特殊字符。 -
标准的正则表达式使用方括号
[]
表示字符列表,俗称字符集。
字符列表[^字符集]
用于匹配不存在[^字符集]
中任意字符的字符串,(注:无需在每个字符前都重复加^
)
例如[^ab]
可以匹配任意单个字符,除了字符a或字符b
特别的:
如果不需要匹配^
,则对应的正则表达式是[^^]
(第一个^
代表非,第二个^
代表字符本身)
如果不需要匹配^
和\
这两个字符,则对应的正则表达式是[^^\\]
(第一个\
代表转义,第二个\
代表字符本身) -
>
>>
<
<<
都用于重定向:
scriptname > filename
重定向脚本的输出到文件中, 覆盖原有内容
command &> filename
重定向 stdout 和 stderr 到文件中
>&
合并2和1输出
command >&2
重定向 stdout 和 stderr
scriptname >> filename
重定向脚本输出到文件中(相当于append追加,不会覆盖已有内容), 添加到文件尾端, 如果没有文件, 则创建这个文件。
<<
用于Here Document
<<<
用于Here String
Here Document
一个Here Document就是一段带有特殊目的的代码段。中文名可以叫嵌入文档
,缩写为HereDoc
它使用I/O重定向的形式将一个命令序列传递到一个交互程序或者命令中, 比如ftp, cat, 或者ex文本编辑器。
如果你尝试在脚本嵌入一小块多行数据,使用 Here Document 是很有用的,而嵌入很大的数据块是一个不好的习惯。你应该保持你的逻辑(你的代码)和你的输入(你的数据)分离,最好是在不同的文件中,除非是输入一个很小的数据集。
Here Document 的基本用法是:
cmd << EOF
document1
document2
...
documentN # 文件的内容
EOF
其中cmd
是shell命令,<<
是重定向引导标记,其后的EOF
标志着HereDoc的开始,末尾的EOF
标志着HereDoc的结束。EOF
是一个限定符,可以由开发人员替换成任意字符串。两个限定符之间的内容将被当做是一个doc并用作 cmd
命令 的标准输入。
EOF
作为一个tag,可以被替换成任意字符串。tag之后的内容会作为前面的shell命令需要处理的数据,直到再次遇见顶格写、独占一行的tag为止。因此我们需要注意:
- 标志文件结束的tag一定要顶格写并且独占一行
- 在Here Document中,也可以出现tag,前提是tag没有顶格出现并作为独立的一行单独存在
举个栗子:
$ cat <<END
> COMP9044
> 22T2
> END
COMP9044
22T2
忽略命令替换
默认情况下,正文中出现的变量和命令也会被求值或运行,Shell 会先将它们替换以后再交给 command,请看下面的例子:
$ courseID=COMP9044
$ name=Software Construction: Techniques and Tools
$ cat <<END
> ${courseID} is ${name}.
> END
COMP9044 is Software Construction: Techniques and Tools.
用单引号或双引号将分解符包裹起来可以使shell中的变量替换失效
$ courseID=COMP9044
$ name=Software Construction: Techniques and Tools
$ cat <<’END‘
> ${courseID} is ${name}.
> END
${courseID} is ${name}