我想用shell脚本做一个普通的子串匹配

时间:2009-08-01 03:27:25

标签: shell

我想知道如何在shell脚本中进行普通子字符串匹配。

例如,如果我有

STRING1="http://127.0.0.1/"
STRING2="http://127101011/"
SUBSTRING="127.0.0.1"

我希望SUBSTRING匹配STRING1但不匹配STRING2。它就像java.lang.String.indexOf(String)。

我想这个问题也可以通过正确转义SUBSTRING的内容来修复,但我似乎无法弄清楚如何。

谢谢你, wbkang

3 个答案:

答案 0 :(得分:4)

STRING1="http://127.0.0.1/"
STRING2="http://127101011/"
SUBSTRING="127.0.0.1"
for string in "$STRING1" "$STRING2"
do
    case "$string" in
    (*$SUBSTRING*) echo "$string matches";;
    (*)            echo "$string does not match";;
    esac
done

(*)中的“case”符号适用于Korn shell和Bash;它不适用于原始的Bourne shell - 不需要引导'('。

或者,可以使用expr命令 - 这是另一个经典(和POSIX)命令,可能会被更现代的shell中的某些功能淘汰。

答案 1 :(得分:3)

你可以在这里找到一个脚本:

http://www.etalabs.net/sh_tricks.html

fnmatch () { case "$2" in $1) return 0 ;; *) return 1 ;; esac ; }

或者,效率稍高的版本可能是:

fnmatch () { case "$2" in $1) return 0 ;; esac ; return 1 ; }

然后将其用作:

if fnmatch "$SUBSTRING" "$STRING1" ; then ...

请注意,根据* / ?模式规则(非正则表达式),[]glob和括号fnmatch将被视为特殊。< / p>

答案 2 :(得分:0)

#!/bin/bash

function is_matching() {
    if [[ `echo "$1" | grep "$2"` != "" ]]; then return 1; fi
    return 0;
}

is_matching "abcd" "bc"
echo $?
is_matching "abcd" "XX"
echo $?

运行该脚本:

$ ./test
1
0

如果您想在不使用grep的情况下执行此操作,请阅读此链接 - &gt; bash string manipulation