[^A-Z] 是匹配的什么啊?

我本来理解的是匹配非A-Z的字符,得到结果不对啊。。。求解

aa文件如下:
234234
sfsf
sfklj342
aaaaaaa
ABSD
DDFG
khjh
434er3ABSD

$ cat aa|awk '{if($0~/[^A-Z]/)print $0}'         
234234
sfklj342
aaaaaaa                                                                  少了sfsf,khjh
434er3ABSD

$ cat aa|awk '{if($0~/[^a-z]/)print $0}'        
234234                      少了ABSD,DDFG  
sfklj342
434er3ABSD

为什么啊。。。求助~

作者: l33549   发布时间: 2011-04-24

man setlocale

       LC_COLLATE
              for regular expression matching (it determines the  meaning  of
              range  expressions  and  equivalence classes) and string colla-
              tion.

       LC_CTYPE
              for regular expression matching, character classification, con-
              version,  case-sensitive  comparison,  and wide character func-
              tions.

作者: 哎_还是算了   发布时间: 2011-04-24

:em40:  球好心人翻译。。

作者: l33549   发布时间: 2011-04-24

NAME

setlocale − 设 置 当 前 的 区 域 选 项

总 览 (SYNOPSIS)

#include <locale.h>

char *setlocale(int category, const char * locale);

描 述 (DESCRIPTION)

setlocale() 函 数 用 来 设 置 或 者 查 询 程 序 当 前 的 区 域 选 项 .

如 果 locale 不 是 NULL, 程 序 就 会 根 据 参 数 更 改 相 应 的 区 域 选 项 . category 参 数 指 定 区 域 选 项 的 哪 一 部 分 需 要 更 改 .

LC_ALL

代 表 所 有 部 分 .

LC_COLLATE

代 表 正 则 表 达 式 匹 配 (和 范 围 表 达 式 [range expressions] 以 及 字 符 类 [classes] 有 关 系 ) 和 字 符 串 排 序 .

LC_CTYPE

代 表 正 则 表 达 式 匹 配 , 字 符 类 (character classification), 转 换 , 区 分 大 小 写 的 比 较 , 以 及 宽 字 符 函 数 .

LC_MESSAGES

代 表 可 以 本 地 化 的 消 息 (自 然 语 言 ).

LC_MONETARY

代 表 货 币 格 式 .

LC_NUMERIC

代 表 数 字 格 式 (比 如 小 数 点 和 千 位 分 组 符 ).

LC_TIME

代 表 时 间 和 日 期 格 式 .

locale 参 数 是 一 个 指 向 字 符 串 的 指 针 . 此 字 符 串 为 category 需 要 的 设 置 . 此 字 符 串 可 以 是 一 个 众 所 周 知 的 区 域 选 项 常 量 , 如 "C" 或 "da_DK" (见 下 ), 也 可 以 是 另 外 一 个 setlocale 调 用 返 回 的 字 符 串 .

如 果 locale 是 "", 需 要 更 改 的 部 分 会 根 据 环 境 变 量 做 相 应 的 设 置 . 具 体 的 和 实 现 有 关 . 对 于 glibc 来 说 , 首 先 查 看 环 境 变 量 LC_ALL (不 管 category),然 后 查 看 和 category (LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME) 同 名 的 环 境 变 量 , 最 后 查 看 环 境 变 量 LANG. 以 先 查 到 的 环 境 变 量 为 准 . 如 果 其 值 不 是 一 个 有 效 的 区 域 选 项 , 区 域 选 项 将 不 会 改 变 , setlocale 会 返 回 NULL.

标 准 区 域 选 项 "C" 和 "POSIX" 是 可 移 植 的 ; 它 的 LC_CTYPE 部 分 对 应 的 是 7 位 的 ASCII 字 符 集 .

一 个 典 型 的 区 域 选 项 有 如 下 的 格 式 : language[_territory][.codeset][@modifier], 其 中 language 是 一 个 ISO 639 语 言 代 码 , territory 是 一 个 ISO 3166 国 家 代 码 , codeset 是 一 个 象 ISO-8859-1 或 者 UTF-8 的 字 符 集 或 者 编 码 标 识 符 . 用 "locale -a", cf. locale(1) 可 以 获 得 一 个 系 统 支 持 的 区 域 选 项 的 列 表 .

如 果 locale 是 NULL, 意 味 着 只 是 查 询 当 前 的 区 域 选 项 而 不 更 改 它 .

当 main 程 序 开 始 的 时 候 可 移 植 的 "C" 区 域 选 项 作 为 默 认 值 被 设 置 . 一 个 程 序 可 以 在 初 始 化 之 后 调 用 setlocale(LC_ALL, "" ) 函 数 , 并 且 从 localeconv() 调 用 的 返 回 中 获 得 和 区 域 选 项 相 关 的 信 息 , 如 果 MB_CUR_MAX > 1 就 用 多 字 节 和 宽 字 节 函 数 来 处 理 文 本 , 用 strcoll(), wcscoll() 或 者 strxfrm(), wcsxfrm() 来 比 较 字 符 串 , 这 样 就 可 以 使 程 序 有 较 好 的 移 植 性 .

返 回 值 (RETURN VALUE)

一 个 成 功 的 setlocale() 调 用 会 返 回 一 个 表 示 当 前 区 域 选 项 的 字 符 串 (指 针 ). 这 个 字 符 串 可 能 是 在 静 态 存 储 区 中 分 配 的 . 之 后 用 相 应 的 category 和 这 个 字 符 串 作 为 参 数 再 去 调 用 这 个 函 数 会 重 新 把 程 序 区 域 选 项 的 相 应 部 分 恢 复 . 如 果 请 求 不 能 完 成 将 会 返 回 NULL .

遵 循 (CONFORMING TO)

ANSI C, POSIX.1

注 意 (NOTES)

Linux (也 就 是 , GNU libc) 支 持 可 移 植 的 "C" 和 "POSIX" 区 域 选 项 . 在 以 前 它 曾 经 支 持 欧 洲 Latin-1 区 域 选 项 "ISO-8859-1" (比 如 说 在 libc-4.5.21 和 libc-4.6.27 中 ), 和 俄 罗 斯 的 "KOI-8" (更 准 确 点 是 , "koi-8r") 区 域 选 项 (比 如 在 libc-4.6.27 中 ), 所 以 设 置 一 个 环 境 变 量 LC_CTYPE=ISO-8859-1 就 能 够 让 isprint() 返 回 正 确 的 结 果 . 现 在 不 讲 英 语 的 欧 洲 人 会 比 以 前 更 麻 烦 一 些 , 他 们 需 要 安 装 相 应 的 区 域 选 项 文 件 .

参 见 (SEE ALSO)

locale(1), localedef(1), strcoll(3), isalpha(3), localeconv(3), strftime(3), charsets(4), locale(7)

[中 文 版 维 护 人 ]

唐 友 <tony_ty [AT] 263.net>

[中 文 版 最 新 更 新 ]

2001/12/2

[中 国 Linux论 坛 man手 册 页 翻 译 计 划 ]

http://cmpp.linuxforum.net

作者: 哎_还是算了   发布时间: 2011-04-24

回复 l33549

[A-Z]
指的是A-Z之间的单个字符,例如
A
B
C

.
.
Z
就匹配上了

作者: 南极雨   发布时间: 2011-04-24



QUOTE:
回复  l33549

[A-Z]
指的是A-Z之间的单个字符,例如
A
B
C

.
.
Z
就匹配上了
南极雨 发表于 2011-04-24 20:05




   是 [^A-Z] 。。。

作者: l33549   发布时间: 2011-04-24

本帖最后由 只爱睡觉 于 2011-04-24 21:04 编辑

[]是一个字符组,该字符组[^A-Z]匹配是,不匹配大写字母A-Z,^不匹配。

作者: 只爱睡觉   发布时间: 2011-04-24

:emn34: 问题还是没解决。。。我也这么理解的,但是结果不对啊

作者: l33549   发布时间: 2011-04-24

http://bbs.chinaunix.net/viewthr ... p;extra=&page=1

作者: ziyunfei   发布时间: 2011-04-24

回复 l33549


把LANG设置成C试试
#awk '$0~/[^A-Z]/' urfile
234234
sfsf
sfklj342
aaaaaaa
khjh
434er3ABSD
#locale
LANG=
LC_CTYPE="C"
LC_COLLATE="C"
LC_TIME="C"
LC_NUMERIC="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

作者: Shell_HAT   发布时间: 2011-04-24