我有两个关于在 shell 中使用正则表达式的问题。
1. * 的使用
*:星号表示前面的元素有零个或多个。例如,ab*c 匹配“ac”、“abc”、“abbc”、“abbbc”等。
但是,当我写入时rm test*.iso
,它将删除以“test”开头并以“.iso”结尾的所有文件,无论“test”和“.iso”之间有(或没有)。所以,文件“tes.iso”将是不是已删除。
如果以 abc 为例,根据维基百科,“ab*c”匹配“ac”。因此rm ab*c
应该删除一个“ac”文件。为什么 rm 不使用维基百科描述的正则表达式?
2. 使用 - 和 ?
仍根据关于正则表达式的维基百科页面:
?:问号表示前面的元素有0个或1个。例如,colour?r 匹配“color”和“color”。
+:加号表示前面有一个或多个元素。例如,ab+c 匹配“abc”、“abbc”、“abbbc”等,但不匹配“ac”。
“?”看起来像“*”,也就是说“?”符号替换一个或零个元素(但不是前面的一个,与维基百科所说的相反)。
我不知道如何使用“+”,这是我的第二个问题。我也对有关正则表达式和rm, cp, ...
.
答案1
外壳的模式匹配符号描述于本标准文件。
正如该文档在其简介中所说,模式匹配表示法与正则表达式表示法相关,但略有不同。
特别是,?
在 shell 中的行为类似于.
正则表达式,而*
在 shell 中的行为类似于.*
正则表达式。 (但是它们都不会匹配.
文件名开头的 a。)+
shell 中没有任何特殊的模式匹配能力。然而,正如 @HaukeLaging 在他的回答中所说,某些 shell 可以选择启用正则表达式表示法,尽管这样做是非标准的。
答案2
shell 仅在某些条件下使用正则表达式(不同 shell 可能有所不同)。
您bash
必须使用以下命令激活它们:shopt -s extglob
之后你可以使用类似的东西:
echo a*(b)c
Pattern Matching
请参阅中的块man bash
。