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



所以基本上类似于expr index '0123 some string' '012345789'但颠倒了。
我想找到不是给定字符之一的第一个字符的索引......
如果可能的话,我宁愿不使用正则表达式...

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

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

一旦你有字符找到索引,请遵循相同的内容

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

使用 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
我知道

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

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

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

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

我之所以使用d,是因为我认为您错误地从列表中遗漏了数字 6 012345789

索引当前指向该空间:

0123 some string
    ^ this space

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

它可以通过两个步骤完成:切割字符串,计算字符(长度)。

#!/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).

它被编写为在许多外壳上工作(当然包括 bash)。

用作:

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

相关内容

  • 没有找到相关文章

最新更新