我想在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
。