检查字符串中是否按顺序包含嵌入的字符串

3

我希望检查一个字符串是否嵌入在另一个字符串中。例如,pineappleapple 匹配,以及 aepprestlseapple

如果我知道要测试的单词,这是一个简单的任务,例如:

if [[ $e == *"a"*"p"*"p"*"l"*"e"* ]]
then
   echo "match"
fi

然而,当我运行脚本时,我不知道将替换我的"apple"变量的长度或内容是什么。如何在变量大小/内容不确定的情况下进行此检查?

2个回答

1

awk to the rescue!

$ awk -v s='pineapple' -v r='apple' '
     BEGIN{for(i=1;i<=length(r);i++) 
             {s=substr(s,k); 
              k=index(s,substr(r,i,1)); 
              if(k==0) exit 1} 
           exit 0}'; echo $? 

1

以下是如何生成一个匹配的全局模式:

data='bcdaeppr?estlse'
search='app?le'

# generate a regex using sed i.e. *\a*\p*\p*\?\l*\e*
patt="*$(sed 's/./\\&*/g' <<< "$search")"

# now match it
[[ $data == $patt ]] && echo "matched" || echo "nope"
matched

# not matching example
data='bcdaepprestlse'
[[ $data == $patt ]] && echo "matched" || echo "nope"
nope

1
谢谢,最终我采用了一个简化的方法,因为我以前没有使用过fold,但这让我开始了。 - user4332327
1
您可以使用sed 's/./&.*/g;s/\.\*$//' <<< apple创建相同的正则表达式。 - karakfa
1
如果搜索字符串包含受限字符集,则这是可以的,但在某些情况下可能会出现错误。搜索字符串中的空格字符将被忽略。通配符匹配是针对搜索字符串字符进行的,因此如果搜索字符串包含*,则会发生奇怪的事情。如果搜索字符串包含正则表达式元字符如.[],也会出现奇怪的情况。 - pjh
好点子 karakfa和@pjh。我已经修改了它,现在可以转义通配符模式并使用通配符匹配。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接