Индекс Bash первого символа не указан
Так что в принципе что-то вроде expr index '0123 some string' '012345789'
но поменял местами
Я хочу найти индекс первого символа, который не является одним из заданных символов...
Я бы предпочел не использовать RegEx, если это возможно...
4 ответа
Вы можете удалить символы с 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($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
Даже если оболочка может выглядеть похожим образом, это не регулярное выражение.
Это можно сделать в два этапа: вырезать строку, подсчитать количество символов (длина).
#!/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