ksh 命令行上的正则表达式和模式

ksh 命令行上的正则表达式和模式

我想知道在正则表达式字符串中使用*和之间有什么区别。.*

我猜,*代表“0到n个字符”,但我不明白.*代表什么。

例如,:"2013*11*27"和之间有什么区别"2013.*11.*27"?如果我看一下

find . -name [pattern]

作为我尝试过的模式:"2013.*11.*25"并且它没有找到"2013-11-25",但是,使用"2013*11*25",它找到了它。

为什么 ?在unix中,0或n次出现的通配符是:*,在正则表达式中.*那么为什么它不起作用呢?

答案1

*代表0个或多个任意字符外壳通配符火柴。

*代表0 次或多次出现前面的表达式正则表达式火柴。

.代表单个任意字符正则表达式火柴。

因此,*在 shell 中通配符匹配相当于.*在正则表达式中匹配。

“2013*11*27”中正则表达式匹配将匹配"2013333111111111127"但不匹配"2013-11-27",但如果您使用它来查找文件,例如作为 的参数ls,让 shell 将其处理为“shell 通配符匹配”(而不是正则表达式),它将"2013-11-27"很好地捕获。

* (在您的情况下,表达式是与该字符完全匹配的单个字符,3并且1分别。)

答案2

首先,您需要将 regexp 与 unix shell 模式分开。
在 ksh 命令中需要特殊选项,您将使用 unix 模式。
例如,如果您使用 grep -R,您将使用正则表达式。

正则表达式中的Syntax*表示出现 0 次或 n 次。在unix
模式*中,意味着任何字符串,并且取决于带或不带跳行的设置。
如果使用正则表达式,.*则表示除跳转行 0 或 n 次之外的任何字符,并且在正则表达式中
使用将匹配前一个字符 0 或 n 次。*

.*在正则表达式中相当于unix pattenr*

find -name使用unix模式,因此.*在模式中使用表示找不到.ANY_STRING_OR_NO_STRING任何环。
你使用正则表达式使用
find -regex

看待

相关内容