jrd*_*rdn 12 scripting bash regular-expression bash-script
这是我第一次编写 bash 脚本,所以我可能犯了一个简单的错误。
基本上,我正在尝试编写一个脚本来获取用户的组,如果他们在某个组中,它将相应地记录下来。显然会有更多的功能,但是当我什至无法让正则表达式工作时,构建它是没有意义的!
到目前为止,我有这个:
#!/bin/bash
regex="^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
# example output
groups="username : username usergroup"
echo "$groups" >> /home/jrdn/log
if [[ "$groups" =~ $regex ]]; then
echo "Match!" >> /home/jrdn/log
else
echo "No match" >> /home/jrdn/log
fi
Run Code Online (Sandbox Code Playgroud)
我尝试过该正则表达式的每个地方,它都有效。但是在 bash 脚本中,它只输出$groups
, 后跟No match
. 那么有人可以告诉我它有什么问题吗?
der*_*ert 13
来自man 7 regex
:
括号表达式是包含在“[]”中的字符列表。…
... 要包含文字“-”,请将其设为第一个或最后一个字符...。[A]所有其他特殊字符,包括“\”,在括号表达式中失去了它们的特殊意义。
使用 egrep 尝试正则表达式会出现错误:
$ echo "username : username usergroup" | egrep "^([a-zA-Z0-9\-_]+ : [a-zA-Z0-9\-_]+) (usergroup)$"
egrep: Invalid range end
Run Code Online (Sandbox Code Playgroud)
这是一个更简单的版本,它也给出了一个错误:
$ echo 'hi' | egrep '[\-_]'
egrep: Invalid range end
Run Code Online (Sandbox Code Playgroud)
既然\
不是特别的,那就是一个范围,就像[a-z]
会一样。你需要把你的-
放在最后,比如[_-]
或:
echo "username : username usergroup" | egrep "^([a-zA-Z0-9_-]+ : [a-zA-Z0-9_-]+) (usergroup)$"
username : username usergroup
Run Code Online (Sandbox Code Playgroud)
无论您的 libc 版本如何(在 egrep 或 bash 中),这都应该有效。
编辑:这实际上也取决于您的语言环境设置。联机帮助页确实对此发出警告:
范围非常依赖于整理顺序,可移植程序应避免依赖它们。
例如:
$ echo '\_' | LC_ALL=en_US.UTF8 egrep '[\-_]'
egrep: Invalid range end
$ echo '\_' | LC_ALL=C egrep '[\-_]'
\_
Run Code Online (Sandbox Code Playgroud)
当然,即使它没有出错,它也没有做你想做的事:
$ echo '\^_' | LC_ALL=C egrep '^[\-_]+$'
\^_
Run Code Online (Sandbox Code Playgroud)
这是一个范围,这在ASCII,包括\
,[
,^
,和_
。
归档时间: |
|
查看次数: |
28376 次 |
最近记录: |