Bash 未给出第一个字符的索引
Bash index of first character not given
所以基本上类似于 expr index '0123 some string' '012345789'
但相反。
我想找到不是给定字符之一的第一个字符的索引...
如果可能的话,我宁愿不使用正则表达式...
我知道这是用 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
索引当前指向 space:
0123 some string
^ this space
您可以使用 tr
删除字符,然后从剩下的字符中选择第一个
left=$(tr -d "012345789" <<< "0123_some string"); echo ${left:0:1}
_
一旦你有了查找索引的字符,就遵循相同的
expr index "0123_some string" ${left:0:1}
5
使用 gnu awk
和 FPAT
你可以这样做:
str="0123 some string"
awk -v FPAT='[012345789]+' '{print length()}' <<< "$str"
4
awk -v FPAT='[02345789]+' '{print length()}' <<< "$str"
1
awk -v FPAT='[01345789]+' '{print length()}' <<< "$str"
2
awk -v FPAT='[0123 ]+' '{print length()}' <<< "$str"
5
即使 shell 通配符看起来很相似,它也不是正则表达式。
可以分两步完成:切割字符串,统计字符数(长度)。
#!/bin/dash
a="" ### 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
所以基本上类似于 expr index '0123 some string' '012345789'
但相反。
我想找到不是给定字符之一的第一个字符的索引...
如果可能的话,我宁愿不使用正则表达式...
我知道这是用 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
索引当前指向 space:
0123 some string
^ this space
您可以使用 tr
删除字符,然后从剩下的字符中选择第一个
left=$(tr -d "012345789" <<< "0123_some string"); echo ${left:0:1}
_
一旦你有了查找索引的字符,就遵循相同的
expr index "0123_some string" ${left:0:1}
5
使用 gnu awk
和 FPAT
你可以这样做:
str="0123 some string"
awk -v FPAT='[012345789]+' '{print length()}' <<< "$str"
4
awk -v FPAT='[02345789]+' '{print length()}' <<< "$str"
1
awk -v FPAT='[01345789]+' '{print length()}' <<< "$str"
2
awk -v FPAT='[0123 ]+' '{print length()}' <<< "$str"
5
即使 shell 通配符看起来很相似,它也不是正则表达式。
可以分两步完成:切割字符串,统计字符数(长度)。
#!/bin/dash
a="" ### 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