【问题标题】:Shell script variable assignment with two values (regular expression)带有两个值的 Shell 脚本变量赋值(正则表达式)
【发布时间】:2015-03-13 18:30:55
【问题描述】:

我正在尝试设置一个具有两个值的变量。这是一个例子:

letter='[[:alpha:]]'
digit='[[:digit:]]'

integer='$digit'
float='$digit.$digit'

整数变量必须出现一次或多次。变量 float 应显示第一个字段(点之前) 次或多次。我该怎么做?

感谢您的帮助!

-- 更新--

很高兴得到大家的支持。在为我服务的解决方案下方:

letter='[[:alpha:]]'
digit='[[:digit:]]'

integer="${digit}+"
float="[0-9]*\\.[0-9]+"

谢谢你们! :D

【问题讨论】:

  • integerfloat 变量中使用双引号而不是单引号。
  • 查看 bash 手册的 Quoting 部分
  • 谢谢!单引号不起作用。

标签: regex linux bash shell variables


【解决方案1】:

我还没有研究过 bash 的 expr 命令(我假设你正在使用)来验证他们使用哪种正则表达式,所以你可能需要做类似 [a-zA-Z] 而不是 [[:alpha:]] 和类似的替换.但是假设您在 letterdigit 中选择了正确的值,那么这应该可以工作:

expr match "$string" "(${digit}*.${digit}*)"

或者,使用您的 float 变量:

float="(${digit}*.${digit}*)"
expr match "$string" "$float"

如果您只想使用返回值而不是返回匹配的实际值,请删除括号。

以下任何一个都是整数的等效正则表达式:

integer="(${digit}+)"
integer="(${digit}{1,})"
integer="(${digit}${digit}*)"

请注意,正则表达式有不同的“风格”,并且在不同的上下文中,需要对不需要的东西进行转义。

【讨论】:

  • 请注意[a-zA-Z]不一定等价于[[:alpha:]]——前者全是大小写无重音英文字符(ASCII集),而后者全是大小写字符在当前语言环境中。 字母 ñ 可以在 :alpha: 中,但从不在 a-zA-Z 中
【解决方案2】:

对于 bash 命令行上的 egrep 和 grep -E:

float: [0-9]*\\.[0-9]+
integer: [0-9]+

请参阅http://www.cyberciti.biz/faq/grep-regular-expressions/ 的 egrep regx 图表以获取一些提示,但需要针对特定​​情况进行测试

对于 perl 和 java:

float: [0-9]*?\.[0-9]+?
integer: [0-9]+?
+ matches preceding char or char class >= 1 times
* matches preceding char or char class >= 0 times
. matches any char
\. matches an uninterpreted period 
[0-9] matches the class of any digit
? forces reluctant (non-greedy) matching

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多