【问题标题】:Having an issue finding the right UNIX grep command在查找正确的 UNIX grep 命令时遇到问题
【发布时间】:2015-12-31 21:42:47
【问题描述】:

这是作业:

编写一个脚本,该脚本将生成一个由三到五个字母单词组成的排序列表。输入文本将从在线 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) 之外的所有字符。您可以通过使用流编辑器 (sed) 来删除(用任何内容替换)不在该集中的所有字符来做到这一点。提示:如何指定正则表达式以匹配不是字母或空格字符的单个字符?
  2. 为避免重复,请将所有字母转换为相同大小写。应该使用翻译命令(tr)来执行此操作(参见教科书的第 83 页)。例如,“The”和“the”需要被视为同一个词。通过使所有文本大小写相同(大写或小写),您将避免多次列出同一个大小写混合的单词。
  3. 修改剩余的文本,使每个“单词”都放在自己的行上。使用 tr 命令将所有空格转换为换行符。现在,每个“单词”都单独成行。不要担心空行。它们稍后会被过滤掉。
  4. 使用 sort 命令对行(“单词”)进行排序。有没有我们可以使用 sort 来删除重复行的选项?使用该选项。
  5. 使用单个 grep 命令提取 3 到 5 个字母的单词。请记住,每个“单词”现在都在自己的行中。您将需要使用一个正则表达式来指定整行(而不仅仅是在该行某处找到的模式)。我们知道星号代表“零个或多个先前的模式”。什么正则表达式用于表示“一行上的前一个模式的三到五个实例?”。 [整线匹配?你有 regurar 表达式“锚点”来指定行的开始和结束。使用它们! ]

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

【问题讨论】:

  • '{3,5}.'然后你必须匹配整行,这意味着锚定你可以自己查找的开始和结束。

标签: bash unix terminal grep pipe


【解决方案1】:

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

你的老师可能期望什么:

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

正确的方法:

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

2) 为避免重复,请将所有字母转换为相同大小写。应该使用翻译命令(tr)来执行此操作(参见教科书的第 83 页)。例如,“The”和“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
        }'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多