如何在bash shell脚本中使用正则表达式匹配两个字符串?

时间:2014-02-19 14:10:04

标签: regex bash shell

我想在shell脚本中自动执行某些任务。在代码中,我需要对两个共享相同数字但在一个字母中有所不同的名称进行比较。我有一堆字符串:

YC1SM YM1SM YC1SN YM1SN
YC4SM YM4SM YC4SN YM4SN

我需要在以下内容之间进行匹配:

$a=YC1SM
$b=YM1SM

$a=YC4SM
$b=YM4SM

$a=YC4SN
$b=YM4SN

我需要使用正则表达式的if子句基本上做这样的事情:

if [$a matches $b]; then
    command xxx
fi

如何在bash中进行此匹配?

编辑: 名称长度都相同。它们只有一个字母不同。这个不同的字母出现在字符串中的相同位置(这里是第二个字符)。

EDIT2: 添加了更多方案

3 个答案:

答案 0 :(得分:1)

您可以使用BASH正则表达式进行此比较:

a=YC123SM
b=YART123JKL

[[ "$a" =~ ([0-9]+) ]] && n1="${BASH_REMATCH[1]}"
[[ "$b" =~ ([0-9]+) ]] && n2="${BASH_REMATCH[1]}"

[[ "$n1" -eq "$n2" ]] && echo "same" || echo "not same"
same

答案 1 :(得分:1)

根据变量a构建模式,并将b与模式匹配。

a=YC1SM
b=YM1SM
pattern="${a:0:1}?${a:2}"
echo "$pattern"
[[ $b == $pattern ]] && echo match
Y?1SM
match

如果不匹配的字母必须是字母,请将?更改为[[:alpha:]]

答案 2 :(得分:1)

您不需要正则表达式。只需使用子串操作:

c="${a:0:1}${b:1:1}${a:2}"
if [[ "$c" -eq "$b" ]]; then
    command xxx
fi

子字符串运算符的工作方式如下:${var:first:length} 因此,第一行显示a的第一个字符,然后是b的第二个字符,从第三个字符到a的结尾。

在您的情况下,这将创建a(称为c)的副本,该副本将包含a中的所有字母,但它将包含来自{{1}的第二个字符},这是你说的唯一一个可能不同的角色。由于此字符已从b复制到b,因此如果该字符是唯一的差异,则c将匹配c