unix 在shell脚本中搜索给定索引中的字符串

gajydyqb  于 2022-11-04  发布在  Unix
关注(0)|答案(5)|浏览(170)

我对shell脚本比较陌生。我有一个带有字符串值的变量。我需要从给定的索引开始在该变量中搜索字符串。例如

val="hi hello hi yes no hi good hi"

现在我想在变量瓦尔中从索引5开始搜索字符串“hi”。我如何在shell脚本中实现这一点?

umuewwlo

umuewwlo1#

您可以使用${val#?????}来去除前五个字符,并使用简单的case来检查匹配。

case ${val#?????} in *hi*) echo "match";; esac
z9smfwbn

z9smfwbn2#

要获取是否匹配,如果匹配,则获取搜索字符串的位置。然后,您可以提取您想要的任何内容。

if [[ $val =~ ^(.{5}.*?)(hi) ]]
then
echo "match found"
prefix_len=`echo -n ${BASH_REMATCH[1]} | wc -m`  
echo "$prefix_len"
else
echo "match not found"
fi

更具体地说,

[[ $val =~ ^.{5}.*hi ]]

# |^^^ ^^-->string you want to search for

# |  |  |

# |  |  any characters(including zero character)

# |  |

# |  any 5 characters

# |

# start of line

有关bash中regex的更多信息:http://tldp.org/LDP/abs/html/x17129.html

nnsrf1az

nnsrf1az3#

val="hi hello hi yes no hi good hi"

    if [ `echo "${val}" | awk '{print $6}'` == "hi" ]
    then
        echo "Found"
    else
        echo "Not Found"
    fi

val="hi hello hi yes no hi good hi"

    echo "${val}" | cut -f5 -d' ' | grep -qc hello && echo "Found" || echo "Not Found"
azpvetkf

azpvetkf4#

在字符串$val中从索引5开始搜索模式

grep pattern <<< ${val:5}
iqih9akk

iqih9akk5#

试试这个...

val=(hi hello hi yes no hi good hi)
for i in $( seq 0 $( expr ${#val[@]} - 1 ) ) ; do [ ${val[${i}]} == "hi" ] && echo "'hi' is at position: ${i}"; done

这是一个使用数组来分配所有字符串的解决方案,使用for命令将每个位置与字符串“hi”进行比较

  • 这是创建数组的方法之一
  • $(seq 0 $(expr ${#瓦尔[@]} - 1))=〉此命令用于创建一个序列以遍历数组
  • ${#瓦尔[@]} =〉用于标识数组长度;
  • expr ${#瓦尔[@]} - 1 =〉用于计算数组长度减1,因为数组的第一个位置是零
  • 6是最后一个命令的结果,因此条件的结果是seq 0 6,或0 1 2 3 4 5 6
  • [ ${瓦尔[${i}]} ==“hi”] && echo“'hi'位于以下位置:${i}”=〉将每个位置与字符串“hi”进行比较的条件命令
  • ${瓦尔[${i}]} =〉用于访问由索引“i”定义的位置内的值

相关问题