我想删除[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}}"
tr
要d
删除c
您所说的字符集的补充:
printf "%s\\n" "$foo" | tr -dc [a-zA-Z]
perl
音译:
printf "%s\\n" "$foo" | perl -ple 'y/a-zA-Z//dc'