【发布时间】:2014-05-08 15:34:45
【问题描述】:
我需要在 shell 脚本中提取字符串的一部分。原始字符串非常复杂,所以我真的需要一个正则表达式来选择原始字符串的正确部分——仅仅删除前缀和后缀是行不通的。此外,正则表达式需要检查我要提取的字符串的上下文,所以我例如需要一个正则表达式a\([^b]*\)b 从12a123b23 中提取123。
shell 脚本需要可移植,因此我无法使用 Bash 构造 [[ 和 BASH_REMATCH。
我希望脚本健壮,所以当正则表达式不匹配时,脚本应该注意到这一点,例如通过要使用的命令的非零退出代码。
有什么好的方法可以做到这一点?
我尝试了各种工具,但没有一个能完全解决问题:
expr match "$original" ".*$regex.*"工作,除了错误情况。使用此命令,我不知道如何检测正则表达式是否不匹配。此外,expr 似乎采用提取的字符串来确定其退出代码 - 所以当我碰巧提取00时,expr 的退出代码为 1。所以我通常需要使用expr match "$original" ".*$regex.*" || true忽略退出代码echo "$original" | sed "s/.*$regex.*/\\1/"也适用,但错误情况除外。为了处理这种情况,我需要测试我是否找回了原始字符串,这也很不雅。
那么,没有更好的方法吗?
【问题讨论】:
-
你试过
echo $original | grep -o $regex我认为确实如此,-o 只打印匹配的正则表达式部分。 -
你能提供一些输入字符串的样本和你预期的匹配吗?
-
@MikeH-R,
grep -o是 GNUism,而不是便携式 POSIX 指定的选项。 -
@CharlesDuffy 谢谢,我不知道,有便携版吗?我只是在谷歌上搜索并找不到。
-
@MikeH-R,不适用于
grep,不。你可以用 awk 或 sed 做一些可移植的事情。