我有一个变量,其值如此
VAL1="59809_RH_EA_TEST_1_P1_Q"
或
VAL1="89292-RH_EA_TEST_1_P1_Q"
如何使用sed或任何其他bash命令
来仅获取RH_EA_TEST_1_P1_Q
答案 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)
$ 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"