String 如何从脚本中的字符串中删除非字母?

String 如何从脚本中的字符串中删除非字母?,string,bash,shell,String,Bash,Shell,我有: 我想返回: something='sl89wS Gjf-_32b' 如何使其仅返回字母,然后使所有内容都小写?您可以使用参数展开: slwsgjfb 此处,变量的所有非字母字符([^[:alpha:])将被替换为无,即将被省略 示例: ${something//[^[:alpha:]]/} 基本思想是替换所有不是字母的东西: $ str='sl89wS Gjf-_32b' $ echo "${str//[^[:alpha:]]/}" slwSGjfb 毫无疑问: [^a-Z]

我有:

我想返回:

something='sl89wS Gjf-_32b'

如何使其仅返回字母,然后使所有内容都小写?

您可以使用参数展开:

slwsgjfb
此处,变量
的所有非字母字符(
[^[:alpha:]
)将被替换为无,即将被省略

示例:

${something//[^[:alpha:]]/}

基本思想是替换所有不是字母的东西:

$ str='sl89wS Gjf-_32b'
$ echo "${str//[^[:alpha:]]/}"
slwSGjfb
毫无疑问:

[^a-Z]
这适用于
LC\u ALL=en\u US.UTF-8
。但是,如果使用的字符包括重音符号(假设不需要重音符号),则该想法将失败:

或更改核对顺序:

$ s='sl8zZ9wS Gjf-_3éëì2b'
$ echo "${s//[^a-Z]}"
slzZwSGjféëìb
在这些情况下,需要更可靠的字符列表:

$ LC_COLLATE=C
$ echo "${s//[^a-z]}"
slzwjfb                       ### Missing upper chars.
最终可靠的命令行应为:

$ s='sl8zZ9wS Gjf-_3éëì2b'
$ echo "${s//[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]}"
slzZwSGjfb
或更短(如果排序顺序为ASCII字节值):

并将转换添加到大写字符:

$ s="$( LC_ALL=C eval printf '%s' "${s//[^a-zA-Z]}" )"

当然,所有这些都在bash下。

您忘记发布代码了。StackOverflow是关于帮助人们修复代码的。这不是免费的编码服务。有代码总比没有代码好。祝你好运。或者,
[^a-zA-Z]
避免取下盖子。(或者在删除字符之前使用
${s^^}
,但如果需要,则无法保留大小写)@DavidC.Rankin
[^a-zA_Z]
仅在排序顺序为
ASCII字节值
时才能正常工作,而不是一般情况下。假设你的意思是:回答编辑。
$ s="$( LC_ALL=C eval printf '%s' "${s//[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ]}" )"
$ s="$( LC_ALL=C eval printf '%s' "${s//[^a-zA-Z]}" )"
$ printf '%s\n' "${s^^}"
SLZZWSGJFB