我正在尝试编写一个 shell 脚本,我必须在其中查找字符串中是否存在 -32。不幸的是,我必须在不使用任何 bashisms 的情况下完成它,因为它必须在运行 Dash 的计算机上运行。
我试过 case ${1+"$@"} in *-32*);;
但那会得到类似 -321 的东西。有没有办法使用正则表达式或其他东西来查找那个标志?它周围可以有其他标志,由字符串中的空格分隔。
我认为我需要的正则表达式在 -32 之后查找空格或行尾。 -32(\s|$)
我对正则表达式很陌生,所以我不确定这是否是最好的方法。任何帮助将不胜感激!
谢谢!
最佳答案
您可以使用带有单词边界的 grep
:
grep -E '-32\b' FILE
\b
匹配“单词边界”= 字母数字字符和非字母数字字符之间的位置。
在默认语言环境中,“字母数字字符”(如上所用术语)表示与字符类 [a-zA-Z0-9_]
匹配的任何字符(即任何数字,任何字母 A–Z 和下划线)。
以类似的方式,\B
匹配任何不是 单词边界的地方(即它两边的字符属于同一类型的任何位置,或者都是字母数字字符,或都是非字母数字字符)。
因此,如果您想确保减号前面也必须有一个非字母数字字符(例如空格),您可以编写以下内容:
grep -E '\B-32\b' FILE
这将匹配 xx -32 xx
(减号前有一个空格)但不 xx-32 xx
(没有空格) .由于空格和减号都是非字母数字 \B
将在它们之间匹配,但 \b
不会。
如果您想确保减号前面有一个字母数字字符,您可以编写以下内容:
grep -E '\b-32\b' FILE
匹配例如x-32 x
(没有空格),但不是 x -32 x
(减号前有空格)。
关于regex - 在没有 Bashisms 的情况下检查 Shell 中的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24615835/