regex - 为什么 POSIX "printable characters"类不匹配简单字符串?

标签 regex linux shell posix non-printable

我编写了以下脚本来测试“可打印字符”字符类,如here所述.

#!/bin/sh

case "foo" in
    *[:print:]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

我希望这个脚本输出found a printable character"foo" 中至少有一个(事实上,所有)字符是可打印的。相反,它输出 "found no printable characters"。为什么 "foo" 中的字符未被识别为可打印字符?

最佳答案

字符串 [: 只是一个特殊的 inside 括号表达式,括号表达式本身由 [ 引入。所以你的例子应该是:

case "foo" in
    *[[:print:]]*) echo "found a printable character" ;;
    *) echo "found no printable characters" ;;
esac

如果这看起来很麻烦,请考虑例如如何指定一个应匹配小写字母或数字但不匹配大写字母的模式。

有关详细信息,请参阅 section of the POSIX spec detailing bracket expressions in regular expressions . shell 模式中的括号表达式类似于正则表达式中的括号表达式,除了 !^ 的处理。 (尽管在括号表达式的上下文之外,shell 模式和正则表达式之间还有其他差异)。

关于regex - 为什么 POSIX "printable characters"类不匹配简单字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10183328/

相关文章:

regex - 从正则表达式中获取参数

linux - 无法在某些目录下运行 dotnet?

bash - 如何在 shell 中快速求和有向图中的值?

python - 如何在 Python 中正确地将双引号传递给 awk 子进程?

regex - 从文件中删除包含非英语 (Ascii) 字符的行

C# RegEx - 查找 html 标签(div 和 anchor )

Java Matcher.replaceAll() 也匹配 group(0) 元素

c++ - 制作[2] : *** No rule to make target `/usr/lib/i386-linux-gnu/libmpfr.so' in CGAL

C++ - RtMidi 不向输出端口发送任何内容

ruby-on-rails - Rails 回形针处理器 : shell command failing