删除字符串中直到第一个字母 ([a-zA-Z]) 的所有字符

删除字符串中直到第一个字母 ([a-zA-Z]) 的所有字符

我想删除[a-zA-Z] 字符串中第一个字母之前的所有字符。例如:

#121Abc-->Abc

%Ab#c-->Ab#c

Ab#c-->Ab#c

Abc-->Abc

1Abc-->Abc

1 21Abc-->Abc

1^1 Abc-->Abc

注意:所有非字母包括非打印字符。

用bash工具可以吗?

答案1

awk

awk 'sub(/^[^[:alpha:]]*/, "")' infile

sed

sed 's/^[^[:alpha:]]*//' infile

注意:如果您的行中没有字母字符,则输出中将出现空行,要跳过打印这些行以及跳过输入中的空行,您需要使用:

awk 'sub(/^[^[:alpha:]]*/, "") && NF' infile
awk 'sub(/^[^[:alpha:]]*/, "") && /./' infile
sed 's/^[^[:alpha:]]*//;/./!d' infile

或同样的做法grep(感谢@格伦杰克曼

grep -o '[[:alpha:]].*' infile

答案2

使用 POSIX sh 参数扩展运算符(最初来自 ksh),假设输入位于 shell 变量中:

$ string='#123Abc'
$ printf '%s\n' "${string#"${string%%[[:alpha:]]*}"}"
Abc

请注意,[A-Za-z]除了在 C 语言环境中,匹配的内容是未指定的。实际上,它是相当随机的,尤其是bash带壳的

[[:alpha:]]匹配区域设置中所有被视为字母的字符(或更一般地,这些字符通常是人类语言单词转录的一部分,即使在非字母文字中也是如此)。要仅匹配 ASCII 英文字母而不考虑区域设置,您可以使用[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ].

答案3

仅使用 Bash:

$ shopt -s extglob
$ a='#121Abc'
$ printf '%s\n' "${a/#*([!a-zA-Z])/}"
Abc

(依此类推,设置a为您要处理的任何字符串)。

答案4

没有工具,但只有bash功能:

foo="#121Abc"
[[ "$foo" =~ ^[^a-zA-Z]* ]] && printf "%s\\n" "${foo:${#BASH_REMATCH}}"

trd删除c您所说的字符集的补充:

printf "%s\\n" "$foo" | tr -dc [a-zA-Z]

perl音译:

printf "%s\\n" "$foo" | perl -ple 'y/a-zA-Z//dc'

相关内容