ksh 正则表达式错误'=〜`意外

Posted

技术标签:

【中文标题】ksh 正则表达式错误\'=〜`意外【英文标题】:ksh regex error '=~` unexpectedksh 正则表达式错误'=〜`意外 【发布时间】:2015-01-08 16:55:34 【问题描述】:

我有一个 rpm 规范,它在 %pre 部分运行一些测试。

我正在使用 AIX 5.3 和 korn shell。

我的脚本从 ps 中提取一些东西,即 foo 和 foobar(我只想要 foo),然后测试每个值以查看它是否与模式匹配。

但是代码

if [[ $x =~ foo$ ]]; then echo match fi

返回错误=~意外

人说字符串=~ere

如果字符串匹配模式 ~(E)ere 则为真,其中 ere 是扩展的正则表达式。

所以看来=~是支持的。

我做错了什么?

【问题讨论】:

为什么不让grep 为您应用正则表达式,而不是后处理? (如果我更了解你的平台,我建议使用更适合该任务的工具,而不是 grepping ps 的输出—— pgrep 和 kin 在 Linux 上更有可能是正确的东西,但我没有一个 AIX 系统来检查/测试)。 谢谢。我确实可以尝试这个,因为最终我希望我的脚本能够同时在 AIX/Linux KSH88/Bash 上工作 【参考方案1】:

您所做的事情(检查字符串是否具有给定的后缀)根本不需要正则表达式。

if [[ $x = *foo ]]; then echo match; fi

...提供与

等效的行为
if [[ $x =~ foo$ ]]; then echo match; fi

...但是,当然,可以在没有后一个功能的 shell 上工作。


如果您确实想在[[ ]] 中使用=~,那么请确保您正在运行ksh93; AIX 上的默认 ksh 是一个更老的实现。

要运行 ksh93,请使用 #!/usr/bin/ksh93 而不是 #!/usr/bin/ksh 开始您的脚本。

【讨论】:

当您尝试匹配的字符串有前导空格 [[ $x = * foo ]] 似乎不起作用时,您将如何使用它,前导空格会导致语法错误,因为 * 不是预期的跨度> @Nicolaso​​me, [[ $x = *" "foo ]] 很好。这不是关于 * 的意外,而是关于 = 只期望其右侧有一个单词,并且需要引用或转义以确保 RHS 内容解析为一个单词。 @Nicolaso​​me, ...顺便说一句,您可以随时设置var='* foo',然后检查是否[[ $x = $var ]];当以这种方式使用时,它仍会将* 视为通配符(而如果您添加引号并将其设为[[ $x = "$var" ]],那么它会将* 视为要匹配的精确字符串)。

以上是关于ksh 正则表达式错误'=〜`意外的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配产生意外结果

意外输出.match()和正则表达式

Python正则表达式SyntaxError:行继续符后的意外字符

java正则表达式中[&&]用法

正则表达式

P2169 正则表达式