尝试从bash中的字符串中检索前5个字符(仅限数字和字母)

时间:2017-08-01 07:50:59

标签: bash shell

我有一个像这样的字符串

  

1-A-BC-DXYZ

我想获得1-a-bc-d(前5个字符,只有数字和字母)

由于

6 个答案:

答案 0 :(得分:4)

gawk:

   awk '{ for ( i=1;i<=length($0);i++) { if ( match(substr($0,i,1),/[[:alnum:]]/)) { cnt++;if ( cnt==5) { print substr($0,1,i) } } } }' <<< "1-a-bc-dxyz"

逐个读取每个字符,然后如果字母数字字符的模式匹配(使用匹配函数),则递增变量cnt。当cnt变为5时,打印到目前为止我们看到的字符串(使用substr函数)

输出:

 1-a-bc-d

答案 1 :(得分:1)

a='1-a-bc-dxyz'
count=0
for ((i=0;i<${#a};i++)); do
    if [[ "${a:$i:1}" =~ [0-9]|[a-Z] ]] && [[ $((++count)) -eq 5 ]]; then
        echo "${a:0:$((i+1))}"
        exit
    fi  
done

您可以进一步缩小为;

a='1-a-bc-dxyz'
count=0
for ((i=0;i<${#a};i++)); do [[ "${a:$i:1}" =~ [0-9]|[a-Z] ]] && [[ $((++count)) -eq 5 ]] && echo "${a:0:$((i+1))}"; done

答案 2 :(得分:1)

使用GNU awk:

$ echo 1-a-bc-dxyz | \
awk -F '' '{b=i="";while(gsub(/[0-9a-z]/,"&",b)<5)b=b $(++i);print b}' 
1-a-bc-d

说明:

awk -F '' '{                        # separate each char to its own field
    b=i=""                          # if you have more than one record to process
    while(gsub(/[0-9a-z]/,"&",b)<5) # using gsub for counting (adjust regex if needed)
        b=b $(++i)                  # gather buffer
    print b                         # print buffer
}'

答案 3 :(得分:1)

GNU sed支持替换第k个匹配项的选项以及之后的所有匹配项。

echo "1-a-bc-dxyz" | sed 's/[^a-zA-Z0-9]*[a-zA-Z0-9]//g6'

答案 4 :(得分:0)

使用sed&amp;组合AWK

echo 1-a-bc-dxyz | sed 's/[-*%$#@]//g' | awk -F '' {'print $1$2$3$4$5'}

您也可以使用for循环打印字符。

答案 5 :(得分:0)

echo '1-a-bc-dxyz' | grep -Eo '^[[:print:]](-*[[:print:]]){4}'

这很简单 既不是sed也不是awk。