如何提取字符串中数字之前的单个字符

如何提取字符串中数字之前的单个字符

我有一个列表,其中包含我们公司可用的主机名称。

例如 :

  • 古斯瓦斯特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示例实现:grepgrep -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

相关内容