我想在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: 添加了更多方案
答案 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
。