问题3225--马斯卡彭与Shell编程

3225: 马斯卡彭与Shell编程

时间限制: 1 Sec  内存限制: 512 MB
提交: 7  解决: 3
[状态] [讨论版] [提交] [命题人:]
题目描述
最近 一个非常喜欢吃马斯卡彭的学长正在上Linux课程,对Linux的知识充满了兴趣,非常喜欢使用Shell编程。但是Shell编程写起来非常的痛苦。
在Linux的终端中。你可以执行各种各样的命令,比如 `ls`列出当前目录下有什么。
定义:一个合法的命令一定是由:小写字母,数字,减号组成的非空字符串。
当然每一个命令是可以有选项的:
localhost@LingNc:~$ ls -l
drwxr-xr-x  2 lingnc lingnc  4096 Mar 27  2024  C++
定义:一个合法的选项一定是由一个 减号 - 开头长度为2的字符串,命令与选项之前只有一个空格,例如 `-a`。
一个完整的命令行的组成如下:
ls -a dir -l
其中 `ls`是命令,`-l `与 `-a`都是选项,而 `dir`是 `-a`选项的参数。
参数由小写字母,数字和减号组成。
爱吃马斯卡彭的学长非常好奇这些参数是怎么被程序处理的,但是学长的知识有限,所以请你来写一个程序,为这个 `bash`终端的执行的命令解析他们的参数。
在一个命令输入的选项中有两种:
  1. 无参选项,即像 `ls -l`中的 `-l`一样后面没有附带参数。合法的选项
  2. 有参选项,比如 `ls -a root`中的 `-a`这个选项后面需要接一个 `root`字符串作为 `-a`选项的参数。
因为在Linux中命令非常的多,爱吃马斯卡彭的学长通过查阅手册得知了 `ls`这个命令有哪些选项的字符串,比如:`la:r:`。
  1. 如果一个字母带了冒号`a:`或者`r:`那么他就是有参数的选项
  2. 如果一个字符不带冒号`l`那么他就是无参数的选项。
现在爱吃马斯卡彭的获得了一些命令(不一定是`ls`)对应的命令行,他想知道这个命令行中的参数是不是合法的,他通过查阅手册知道了每个命令的格式字符串,现在请你帮帮他吧。
对于每个命令行(每一行),你的工具应当一直向这一行后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的该行未分析部分不构成该行命令的选项,因此你的程序应当忽略它们,只输出前面合法的选项。

输入
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N (1 ≤ N ≤ 20),表示你需要处理的命令行的个数。
接下来有 N 行,每行是一个待处理的命令行,它包括不超过 2500 个字符。
该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里至少只包含小写字母,数字和减号,长度至少为 1。
输出
输出有 N 行。其中第 i 行以 `Case i: ` 开始(注意有一个空格),然后应当按照字母升序输出该命令行中合法的选项的名称。
对于带参数的选项,在输出它的名称之后还要输出它的参数。
注意:
  1. 如果一个选项在命令行中出现了多次,只输出一次。
  2. 如果一个带参数的选项在命令行中出现了多次,输出对应参数的时候只输出最后一次出现时所带的参数。
  3. 对于一个有参选项,没有参数是非法的,一个合法的参数是由小写字母,数字,减号组成的非空字符串。
  4. 如果只有命令没有给选项就只输出`Case i:

样例输入 Copy
zxf:c:v
5
check -z -x -f documents -z
check
check -c 10 -x -c 15
check -z -x -f -f -c -v
check -f

样例输出 Copy
Case 1: -f documents -x -z
Case 2:
Case 3: -c 15 -x
Case 4: -c -v -f -f -x -z
Case 5:

提示
例如样例5,有参选项必须有参数才是合法的
来源/分类