我有一个列表,其中包含我们公司可用的主机名称。
例如 :
- 古斯瓦斯特03
- gkjbossp1
- frdwop04
数字前面的最后一个字符t
, p
,q
代表主机的环境。所有字符串均以数字结尾。
t
用于测试p
对于产品q
对于质量保证
我需要一个正则表达式来获取导致主机名 和 处数字的字符(我需要一个针对单个字符串的解决方案,而不是在文件中全部列出)
例如 :
格瓦斯t03
在这个字符串中,我只想提取t
字符。
先感谢您。
答案1
grep
由于您已用and标记了问题sed
,我假设字符串列表表示为某些文本输入的每行一项。
然后:
sed -n 's/^.*\([^[:digit:]]\)[[:digit:]]\{1,\}$/\1/p' < that-input
或(假设 GNUgrep
或兼容构建有类似 perl 的正则表达式支持):
grep -Po '\D(?=\d+$)' < that-input
将输出以非数字结尾的行中尾随数字之前的非数字字符,后跟 1 个或多个数字。
两者都使用正则表达式来进行匹配,但sed
使用基本正则表达式,同时grep -P
使用类似 perl 的正则表达式。
一些sed
实现-P
也支持,但不是最常见的。对扩展正则表达式的多种支持-E
,这是正则表达式的另一种方言。和那些:
sed -E -n 's/^.*([^[:digit:]])[[:digit:]]+$/\1/p' < that-input
或者你可以只使用perl
它本身:
perl -lne 'print $1 if /(\D)\d+$/' < that-input
(注意perl
默认情况下在字节级别而不是字符级别工作,请参阅-C
告诉其将输入解释为 UTF-8 字符的选项,或者-Mopen=locale
按照区域设置的编码对输入/输出进行解码/编码,就像grep
/sed
通常那样)。
或者, libpcre(GNU 使用的库)附带的pcregrep
示例实现:grep
grep -P
pcregrep -o1 '(\D)\d+$' < that-input
答案2
用普通的 bash
shopt -s extglob
for host in "${hosts[@]}"; do
tmp=${host%%+([[:digit:]])} # strip the trailing digits
echo "$host => ${tmp: -1}" # extract the last character
done
gswast03 => t
gkjbossp1 => p
frdwop04 => p
或者使用正则表达式匹配:
for host in "${hosts[@]}"; do
if [[ $host =~ ([^[:digit:]])[[:digit:]]+$ ]]; then
echo "$host => ${BASH_REMATCH[1]}"
fi
done
答案3
.*([pqt])\d+$
匹配任何字符,后跟 ap、q 或 t 以及一个或多个数字。匹配组是您感兴趣的单个字母。
答案4
这将在每个 UNIX 机器上的任何 shell 中使用任何 sed 来工作:
$ sed 's/.*\([^0-9]\).*/\1/' file
t
p
q
以上是针对此输入文件运行的:
$ cat file
gswast03
gkjbossp1
frdwoq04