在Linux中使用regex和grep查找文件中的字符串

时间:2015-03-20 20:40:21

标签: regex linux grep

我正在尝试使用文件text.txt上的grep命令找到正确的正则表达式。

问题

  1. 查找包含子字符串ad,bd,cd,dd,ed的文本中出现的所有单词。

  2. 查找所有出现的数字> 100

  3. 查找所有出现的数字> 100包含数字0或5

  4. 我的方法

    1. grep -io '[a-e]*d' text

      使用正确的子字符串打印单词,但不打印整个字符串/单词。

      ad
      d
      d
      ed
      d
      d
      ed
      d
      d
      d
      d
      ed
      d
      d
      
    2. grep -io '[199][1-9]*' text

      我相信我对正则表达式有所了解,但它仍会打印出正确的结果。

      1973
      197
      17775
      
    3. grep -io '[05][1-9]*' text

      这是2.的延续,所以我不理解3.中的2.部分,但我相信我的字符串包含0或5的数字正确。

      0
      0
      0
      5
      

2 个答案:

答案 0 :(得分:0)

对于(a)部分,grep的-o选项使其仅打印 与该模式匹配的行的部分,但您的模式与整个单词不匹配。您只需调整模式以匹配[a-e]d子字符串之前和之后每个单词的部分。

对于(b)部分,你的模式是错误的。例如,它与数字299或1000不匹配。您想要的数字模式是19之间的数字,后跟09之间至少两位数。

(c)部分是最棘手的。您必须匹配包含至少三位数的数字模式,第一个数字位于19之间,第一个位置为50或{{1在任何其他位置。您可能需要将其与5运算符分隔为备选方案。看起来您可能需要三个:前导数字为|的情况;第二个数字为50的情况,以及后一个数字为50的情况。在第三种情况下,您不能忘记在您匹配的50的任意一侧可能有任意数量的附加数字,包括零。

答案 1 :(得分:0)

A)查找包含子字符串ad,bd,cd,dd,ed的文本中出现的所有单词。

grep -ow '.*\(a\|b\|c\|d\|e\)d.*' text

egrep -ow '.*(a|b|c|d|e)d.*' text

B)查找所有出现的数字> 100

grep -ow '[1-9][0-9][0-9]\+' text

C)查找所有出现的数字> 100包含数字0或5

grep -ow '[1-9][0-9][0-9]\+' text | grep '\(0\|5\)'

grep -ow '[1-9][0-9][0-9]\+' text | egrep '(0|5)'

我正在使用选项-o来输出它自己行上的每个匹配项,而不是输出模式的整行,以及指定匹配前后的选项-w应该是一个词边界。