Индекс 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
Другие вопросы по тегам