找到正确的UNIX grep命令时遇到问题

时间:2015-10-03 22:34:49

标签: bash unix terminal grep pipe

这是作业:

  

编写一个脚本,生成一个包含三到五个字母单词的单个排序列表。输入文本将从在线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表达式“锚点”,指定行的开头和结尾。使用它们!
  2.   

认为它应该看起来像这样,但它不起作用。

grep '{3,5}'
  

附加信息

     
      
  1. 过滤掉除空格和字母字符(A-Za-z)以外的所有字符。您可以使用流编辑器(sed)删除(替换为空)所有不在该集合中的字符。提示:如何指定正则表达式以匹配不是字母或空格字符的单个字符?
  2.   
  3. 为避免重复,请将所有字母转换为相同的大小写。应使用translate命令(tr)来执行此操作(请参阅教科书的第83页)。例如,'''和'the'需要被视为同一个单词。通过使所有文本具有相同的大小写(上部或下部),您将避免多次列出相同的混合大小写单词。
  4.   
  5. 修改剩余文本,使每个“单词”放在自己的行上。使用tr命令将所有空格转换为换行符。每一个“单词”现在都在一条线上。不要担心空行。他们以后会被过滤掉。
  6.   
  7. 使用sort命令对行(“单词”)进行排序。我们可以选择使用sort来删除重复的行吗?使用该选项。
  8.   
  9. 使用单个grep命令,提取3到5个字母的单词。请记住,每个“单词”现在都是独立的。您将需要使用指定整行的正则表达式(而不仅仅是在行中某处找到的模式)。我们知道星号表示“前一个模式的零个或多个。”正则表达式用于表示“在一行上自上一个模式的三到五个实例?”。 [全线比赛?你有regurar表达式“锚点”,指定行的开头和结尾。使用它们! ]
  10.   

我对此非常陌生,并且无法在任何地方找到正确的方法,可能是因为我没有找到正确的事情。如果您熟悉如何操作,我将不胜感激,如果您也可以解释它是如何工作的,而不仅仅是给出答案。非常感谢你的帮助!

1 个答案:

答案 0 :(得分:0)

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

老师可能期望的是:

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

正确的方式:

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

2)为避免重复,请将所有字母转换为相同的大小写。应使用translate命令(tr)来执行此操作(请参阅教科书的第83页)。例如,'''和'the'需要被视为同一个单词。通过将所有文本设置为相同的大小写(上部或下部),您将避免多次列出相同的混合大小写单词。

你的老师:

tr 'A-Z' 'a-z'

正确的方式:

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

3)修改剩余的文本,使每个“单词”放在自己的行上。使用tr命令将所有空格转换为换行符。每一个“单词”现在都在一条线上。不要担心空行。他们以后会被过滤掉。

你的老师:

tr ' ' '
'

更好::

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

4)使用sort命令对行(“单词”)进行排序。我们可以选择使用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
        }'