在这个命令上:
$ echo "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz" |
> sed 's/[a-z]//g'
ABCDEFGHIJKLMNOPQRSTUVWXYZ
这似乎是正确的,不是吗?
但是,有效的区域设置是en_US.utf8
。这此类区域设置的整理顺序是(使用 bash):
$ printf '%b' "$(printf '\\U%x\\0' {65..90} {97..122})" | sort -z; echo
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
或者,如果您sort
不能使用 -z:
$ printf '%s' $(printf '%s\n' {a..z} {A..Z} | sort); echo
aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ
如果这是正确的,则范围[b-y]
应匹配上面除 之外的所有字符aAYzZ
。
但事实并非如此。
Grep 在 上做同样的事情[a-z]
。它匹配所有小写字符(甚至重音):
$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o '[a-z]'); echo
abcdefghijklmnopqrstuvwxyzéáíèü
并用[a-Z]
它匹配所有字符(该范围应该无效):
$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o '[a-Z]'); echo
abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZéáíèüÉÁÍÈÜ
答案1
我从你的问题中了解到,你想要 grep 或 sed 一系列字符。
使用sed:
$ printf '%s' $(printf '%s\n' {a..z} {A..Z} | sort) | sed 's/b[^|]*y//g'
aAYzZ
使用格列普:
$ printf '%s' $(printf '%s' {a..z} {A..Z} éáíèüÉÁÍÈÜ | grep -o "a[^|]*z"); echo
abcdefghijklmnopqrstuvwxyz