📜  正则表达式最后一场比赛 - Shell-Bash (1)

📅  最后修改于: 2023-12-03 15:26:52.272000             🧑  作者: Mango

正则表达式最后一场比赛 - Shell-Bash

在Shell-Bash编程中,正则表达式是非常强大且常见的工具。而在最后一场比赛中,则需要我们将正则表达式发挥到极致。

比赛任务

比赛任务分为两个部分:

  1. 匹配所有由连续的数字和字母组成的字符串,但其中的数字不能大于10。
  2. 将每个匹配到的字符串以其最后一个字符为键,记录到一个字典中(如果已存在则累加)。
解决方案

我们可以使用Bash中的grep命令来实现第一部分的任务。使用-o参数来只显示匹配到的字符串,然后使用正则表达式进行匹配。正则表达式如下:

\b[a-zA-Z]*[0-9]|[1-9]\b

该正则表达式的含义为:匹配一个单词,并且这个单词由若干个字母和一个数字组成。如果这个数字是1到9之间的数字,则这个单词的所有字符都必须是字母。如果这个数字是0,则这个单词只能是由字母组成的。

对于第二部分的任务,我们可以使用Bash中的awk命令来解决。在awk脚本中,我们可以使用一个数组来存储每个匹配到的字符串最后一个字符出现的次数。脚本代码片段如下:

BEGIN{FS=""; OFS=""}   # 设置字段分割符
{
    last_char = $NF   # 记录最后一个字符
    if(last_char in dict){  # 如果该键已存在,则累加值
        dict[last_char] += 1
    }
    else{   # 否则,新建一个键
        dict[last_char] = 1
    }
}
END{
    for(key in dict){  # 遍历字典
        count = dict[key]
        print key, count   # 输出键和对应的值
    }
}
Markdown格式代码片段
# 正则表达式最后一场比赛 - Shell-Bash

在Shell-Bash编程中,正则表达式是非常强大且常见的工具。而在最后一场比赛中,则需要我们将正则表达式发挥到极致。

## 比赛任务

比赛任务分为两个部分:

1. 匹配所有由连续的数字和字母组成的字符串,但其中的数字不能大于10。
2. 将每个匹配到的字符串以其最后一个字符为键,记录到一个字典中(如果已存在则累加)。

## 解决方案

我们可以使用Bash中的`grep`命令来实现第一部分的任务。使用`-o`参数来只显示匹配到的字符串,然后使用正则表达式进行匹配。正则表达式如下:

\b[a-zA-Z]*[0-9]|[1-9]\b


该正则表达式的含义为:匹配一个单词,并且这个单词由若干个字母和一个数字组成。如果这个数字是1到9之间的数字,则这个单词的所有字符都必须是字母。如果这个数字是0,则这个单词只能是由字母组成的。

对于第二部分的任务,我们可以使用Bash中的`awk`命令来解决。在`awk`脚本中,我们可以使用一个数组来存储每个匹配到的字符串最后一个字符出现的次数。脚本代码片段如下:

```awk
BEGIN{FS=""; OFS=""}   # 设置字段分割符
{
    last_char = $NF   # 记录最后一个字符
    if(last_char in dict){  # 如果该键已存在,则累加值
        dict[last_char] += 1
    }
    else{   # 否则,新建一个键
        dict[last_char] = 1
    }
}
END{
    for(key in dict){  # 遍历字典
        count = dict[key]
        print key, count   # 输出键和对应的值
    }
}