如何删除任何字母字符前的数字字符

时间:2017-03-30 01:21:26

标签: bash sed

我有一个变量,其值如此

VAL1="59809_RH_EA_TEST_1_P1_Q" 

VAL1="89292-RH_EA_TEST_1_P1_Q"

如何使用sed或任何其他bash命令

来仅获取RH_EA_TEST_1_P1_Q

4 个答案:

答案 0 :(得分:1)

一种方法是使用Bash正则表达式匹配。

VAL1="59809_RH_EA_TEST_1_P1_Q"

if
  [[ $VAL1 =~ ^[0-9]+_(.*) ]]
then
  VAL1=${BASH_REMATCH[1]}
fi

这假设您的数字后跟一个下划线。如果您想避免这种假设,可以使用:

if
  [[ $VAL1 =~ ^[0-9]+_?(.*) ]]
then
  VAL1=${BASH_REMATCH[1]}
fi

Bash正则表达式匹配用作测试(如果存在匹配,则[[ =~ ]]表达式返回0),并且子表达式(通过在感兴趣的区域周围使用括号在匹配的字符串中定义)可用作元素在数组BASH_REMATCH中,从索引1开始。使用扩展正则表达式。

如果有人想知道,上面的任何地方都不需要双引号。 [[ ]]是特殊的shell语法(不是带有[ / test命令等参数的命令),内部不执行任何分词。该分配也不执行分词。

答案 1 :(得分:1)

Parameter Expansion

$ VAL1='59809_RH_EA_TEST_1_P1_Q'
$ echo "${VAL1#*[_-]}"
RH_EA_TEST_1_P1_Q

$ VAL1='89292-RH_EA_TEST_1_P1_Q'
$ echo "${VAL1#*[_-]}"
RH_EA_TEST_1_P1_Q
  • 这将删除从字符串开始到第一次出现_-
  • 的最小匹配项

答案 2 :(得分:0)

替代方法:

VAL1="59809_RH_EA_TEST_1_P1_Q"

sed方法:

sed 's/^[^_-]*[_-]\(.*\)/\1/' <<< $VAL1

cut方法:

cut -d'_' -f2- <<< $VAL1

输出(两种方法):

RH_EA_TEST_1_P1_Q

答案 3 :(得分:0)

使用awk

#!/bin/sh

rnum () { # remove numeric characters before any alphabetic characters
 awk '
 function ch(i) { return substr(ARGV[1], i, 1) } # ith character
 BEGIN {
         a = "[a-zA-Z]" ; d = "[0-9]"
         n = length(ARGV[1]); i = 1
         for ( ; i <= n && ch(i) !~ a; i++) if (ch(i) !~ d) ans = ans ch(i)
         for ( ; i <= n              ; i++)                 ans = ans ch(i)
         print ans
       }
 ' "$1"
}

# usage
rnum 59809_RH_EA_TEST_1_P1_Q
rnum 89292-RH_EA_TEST_1_P1_Q
rnum "123 abc 456 efg"