Когда я запускаю этот код
#!/usr/bin/bash
str="I am enjoying this day to the fullest !"
x="this"
y=`expr index "$str" "$x"`
z=${str:`expr $y - 1`:5}
echo $x
echo $y
echo $z
, на выходе получается
this
11
ing t
, поэтому я хочу знать, почему это так. И как я могу исправить это?
индекс ищет символы. Возможно, вы хотели сказать match?
Попробуйте
#!/bin/bash
str="I am enjoying this day to the fullest !"
x="this"
y=$(expr "$str" : ".*$x" - length "$x")
z=${str:$y:${#x}}
echo $x
echo $y
echo $z
Оператор : - это оператор якорного регекса. Шаблон для поиска - это "." (любой символ) "*" ноль или более из них, за которым следует строка в $x (примечание: она не должна содержать символов regex без кодировки)
Эта часть вернет длину совпавшей строки, которая будет количеством символов от начала строки ("закрепленной") до конца строки в $x.
Следующая часть вычитает длину $x, чтобы получить смещение в $str до первого символа $x. Это можно заменить на ${#x}, как в следующей строке.