为什么 sed 无法遵循整理顺序?

为什么 sed 无法遵循整理顺序?

在这个命令上:

$ 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

相关内容