shell 中的正则表达式

shell 中的正则表达式

我有两个关于在 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

相关内容