regex - 带有 BRE '.' 的 sed(在 osx Snow Leopard 上)不匹配字符 > ascii 127

标签 regex macos sed bsd env

我在 Mac Os X Snow Leopard 上运行 sed。

sed 是/应该是 BSD sed(手册页日期为 2005-05-10) 手册页指出:

The sed utility is expected to be a superset of 
the IEEE Std 1003.2 (``POSIX.2'') specification.

当我尝试替换时,输入流包含大于 ascii 127 的字符,点与该字符不匹配。

例如

echo -e "a001\0001a - a127\0177a - a128\0200a - a255\0377a - a061\0075a" \
| sed -e 's/a[0-9]\{3\}.a/match/g;' ;
echo "result: $?";

输出结果:

match - match - a128?a - a255?a - match
result: 0

在 Os X Maverick 上(说明相同的手册页),结果报错:

sed: RE error: illegal byte sequence
result: 1

在 linux Mint 13 系统上,同样的指令返回(我的预期):

match - match - match - match - match
result: 0

根据 http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html#tag_09_03这 '。'应该匹配

"any character in the supported character set except NUL".

如果运行这个类似的命令(在 Os X Snow Leopard 上的 gsed 版本 4.2.1):

echo -e "a001\0001a - a127\0177a - a128\0200a - a255\0377a - a061\0075a"\
| gsed -e 's/a[0-9]\{3\}.a/match/g;';
echo "result: $?";

我得到了相同的(对我来说出乎意料的)结果:

match - match - a128?a - a255?a - match
result: 0
  1. 其他人有同样的行为吗?
  2. 可以解释为什么吗? (这是 BSD 中的错误吗??)和/或如何规避/修复? 我只能猜测它与“支持的字符集”有关 然后在不同的系统上会有所不同.... 特别是因为在 SL 系统上,BSD sed 和 GNU sed 的行为相同。 但是我确实已经检查并更改了我的环境: 在 SL 系统上:

    $> env | grep '^L'
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_CTYPE=UTF-8
    

    在 Mint 系统上:

    $user@Mint > env | grep '^L'
    LANG=en_US.UTF-8
    LANGUAGE=en_US:en
    LC_CTYPE=UTF-8
    

最佳答案

您的语言环境是 UTF-8,但您回显的字节序列不是有效的 UTF-8,因为 \0200a\0377a。如果您使用 set LC_ALL=en_US.ISO8859-1 (iso-latin-1),那么它工作正常,因为 echo 的结果是一个有效的 iso-latin- 1 个字符串。

关于regex - 带有 BRE '.' 的 sed(在 osx Snow Leopard 上)不匹配字符 > ascii 127,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20072372/

相关文章:

Javascript 正则表达式检查卡住网页

ios - 如何检查字符串 ios 中的多个单词?

swift - 这是什么原因造成的? - "CoreAnimation: warning, deleted thread with uncommitted CATransaction"

php - 使用正则表达式验证类/方法名称

regex - 是否有可能有匹配所有有效正则表达式的正则表达式?

macos - 在 OS X 上,$QTDIR 的正确设置是什么?

java - Mac OS X Mavericks 中的多个 Java 安装

linux - 从命令行乘以 .dat 文件中的常数

regex - shell 正则表达式 : Extract prices

linux - Sed 语句不工作 Linux Raspbian