未给出第一个字符的Bash索引

时间:2016-03-22 21:03:33

标签: bash shell expr

所以基本上类似于expr index '0123 some string' '012345789'但反过来了 我想找到不是给定字符之一的第一个字符的索引...
如果可能的话,我宁愿不使用RegEx ......

4 个答案:

答案 0 :(得分:1)

您可以使用tr删除字符,然后从剩下的内容中选择第一个字符

left=$(tr -d "012345789" <<< "0123_some string"); echo ${left:0:1}
_

一旦你有了char来找到索引,就按照相同的

expr index "0123_some string" ${left:0:1}
5

答案 1 :(得分:1)

使用gnu awkFPAT可以执行此操作:

str="0123 some string"

awk -v FPAT='[012345789]+' '{print length($1)}' <<< "$str"
4

awk -v FPAT='[02345789]+' '{print length($1)}' <<< "$str"
1

awk -v FPAT='[01345789]+' '{print length($1)}' <<< "$str"
2

awk -v FPAT='[0123 ]+' '{print length($1)}' <<< "$str"
5

答案 2 :(得分:0)

我知道这是在Perl中,但我得说我喜欢它:

$ perl -pe '$i++while s/^\d//;$_=$i' <<< '0123 some string'
4

如果是基于1的索引,您可以使用$.,在处理单行时初始化为1:

$ perl -pe '$.++while s/^\d//;$_=$.' <<< '0123 some string'
5

我正在使用\d,因为我认为你错误地从列表012345789中删除了数字6

索引目前指向空间:

0123 some string
    ^ this space

答案 3 :(得分:0)

即使shell globing看起来相似,它也不是正则表达式。

可以分两步完成:剪切字符串,计算字符(长度)。

#!/bin/dash
a="$1"                  ### string to process
b='0-9'                 ### range of characters not desired.
c=${a%%[!$b]*}          ### cut the string at the first (not) "$b".
echo "${#c}"            ### Print the value of the position index (from 0).

它被编写用于许多shell(当然包括bash)。

用作:

$ script.sh "0123_some string"
4
$ script.sh "012s3_some string"
3