如何在 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 中进行此比赛?

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

编辑2:添加了更多场景

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

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

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

您可以使用 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

你不需要正则表达式。只需使用子字符串操作,如下所示:

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的所有字母,但它将包含来自b的第二个字符,这是您说的唯一可以不同的字符。由于这个字符是从b复制的,c,如果该字符是唯一的区别,c现在将匹配b

相关内容

  • 没有找到相关文章

最新更新