在shell脚本

时间:2017-12-14 04:46:59

标签: bash shell unix

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

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

现在我想在变量val中从索引5开始搜索字符串“hi”。我怎样才能在shell脚本中实现这一点?

5 个答案:

答案 0 :(得分:0)

要获得是否匹配,如果匹配,请获取搜索到的字符串的位置。然后你可以提取你想要的任何东西。

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中正则表达式的更多信息:http://tldp.org/LDP/abs/html/x17129.html

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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"

答案 3 :(得分:0)

试试这个......

WITH mylist(w,x,y,z) AS (
SELECT  010, 46793, '329', '10' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT  011, 46798, '322', '12' FROM SYSIBM.SYSDUMMY1 UNION ALL
SELECT  012, 33333, '111', '14' FROM SYSIBM.SYSDUMMY1 
)
SELECT VALUE1, VALUE2, VALUE3
FROM MYTABLE
INNER JOIN mylist
ON (VALUEW, VALUEX, VALUEY, VALUEZ)=(w,x,y,z)

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

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

答案 4 :(得分:0)

从索引5和

搜索字符串$val中的模式
grep pattern <<< ${val:5}