unix 生成三到五个字母单词的排序列表

30byixjq  于 5个月前  发布在  Unix
关注(0)|答案(1)|浏览(59)

这是作业:
编写一个脚本,它将生成一个由三到五个字母组成的单词的排序列表。输入文本将从在线ls手册页面生成(从'man ls'命令输出)。
这是我目前为止的代码:

man ls | sed '!s/ //g' | tr 'A-Z' 'a-z' | tr -s '\040' '\012' | sort | uniq -u

字符串
这里是我卡住的地方。我们提供了获得所需结果的步骤,但我在弄清楚正确的grep命令时遇到了麻烦。这些是方向:
1.使用单个grep命令,提取3到5个字母的单词。请记住,每个“单词”现在都在自己的行上。您需要使用指定整行的正则表达式(不只是在行中的某个地方找到的模式)。我们知道星号表示“零个或多个前面的模式”。什么正则表达式用于表示“从三到五个示例的前一个模式本身的一行?"。[整行匹配?你有regurar表达式“锚点”,指定行的开始和结束。使用它们!
我认为它应该看起来像这样,但它不起作用。

grep '{3,5}'


额外信息
1.过滤掉除空格和字母字符(A-Za-z)之外的所有字符。提示:如何指定正则表达式来匹配不是字母或空格字符的单个字符?2.为了避免重复,将所有字母转换为相同的大小写。应该使用translate命令(tr)来完成此操作(参见教科书第83页)。例如,“The”和“the”需要被视为同一个词。通过使所有的文本都是相同的情况,(上或下),您将避免多次列出同一个大小写混合的单词。3.修改剩余的文本,使每个“单词”都放在自己的行中。使用tr命令将所有空格转换为换行符。每个“单词”word”现在单独在一行上。不要担心空行。它们稍后会被过滤掉。4.使用sort命令对行(“word”)进行排序。是否有一个选项可以与sort一起使用来删除重复的行?使用该选项。5.使用单个grep命令,提取3到5个字母的单词。请记住,每个“单词”现在都在自己的行上。您需要使用指定整行的正则表达式(不仅仅是在行中的某个地方找到的模式)。我们知道星号表示“零个或多个先前的模式”。什么正则表达式用于表示“在一行中单独存在的先前模式的三到五个示例?"。[整行匹配?你有一个正则表达式“锚点”来指定行的开始和结束。使用它们!]

gudnpqoy

gudnpqoy1#

1)过滤掉除空格和字母字符(A-Za-z)之外的所有字符。您可以通过使用流编辑器(sed)删除(替换为空)不在该集合中的所有字符来实现这一点。提示:如何指定正则表达式来匹配不是字母或空格字符的单个字符?
你的老师可能希望:

sed 's/[^A-Za-z ]//g'

字符串
正确的方法:

sed -r 's/[^[:alpha:][:space:]]+//g'


2)为了避免重复,将所有字母转换为相同的大小写。应该使用translate命令(tr)来完成此操作(参见教科书第83页)。例如,“The”和“the”需要被视为同一个单词。通过使所有文本都采用相同的大小写(大写或小写),您将避免多次列出同一个大小写混合的单词。
你的老师:

tr 'A-Z' 'a-z'


正确的方法:

tr '[:upper:]' '[:lower:]'


3)修改剩下的文本,使每个“单词”都放在自己的一行上。使用tr命令将所有空格转换为换行符。现在每个“单词”都单独在一行上。不要担心空行。它们稍后会被过滤掉。
你的老师:

tr ' ' '
'


better::

tr '[:blank:]' "$'\n'"


4)使用sort命令对行(“单词”)进行排序。有没有一个选项可以用来删除重复的行?使用那个选项。

sort -u


5)使用单个grep命令,提取3到5个字母的单词。请记住,每个“单词”现在都在自己的行上。您需要使用指定整行的正则表达式(不只是在行中的某个地方找到的模式)。我们知道星号表示“零个或多个前面的模式”。什么正则表达式用于表示“". [整行匹配?你有正则表达式“锚点”来指定行的开始和结束。使用它们!]
老师道:

grep -E '^[a-z]{3,5}$'


更好:

grep -E '^[[:alpha:]]{3,5}$'


现在,找出你笔记上的每个命令中哪一个实际上支持你使用,它们之间的区别,然后用管道把它们粘在一起。祝你好运!
顺便说一句,这里是如何在UNIX中使用一个命令而不是管道中的多个命令来完成它的,在这种情况下,使用GNU awk进行排序数组,而其他awk只是管道排序:

$ man ls | awk '
        {
            gsub(/[^[:alpha:][:space:]]+/," ")
            $0=$0
            for (i=1;i<=NF;i++)
               if ($i ~ /.{3,5}/)
                   words[$i]
        }
        END {
            PROCINFO["sorted_in"]="@ind_str_asc"
            for (word in words)
                print word
        }'

相关问题