【问题标题】:Using grep with regular expression将 grep 与正则表达式一起使用
【发布时间】:2012-11-19 13:45:05
【问题描述】:

命令grep -vf 1.txt 2.txt > 3.txt 输入3.txt 什么2.txt1.txt 没有,但是我如何才能使用grep 来仅比较具有(0-9) 的字符串?

Example:

(0001) compare  
test   ignore  
984    ignore  
(10)   compare  
(1242342542) compare  

【问题讨论】:

  • 那么您希望最终输出仅包含该模式,还是仅使用具有该模式的行进行比较?
  • 你想比较两个文件,但是1.txt中的(0001) compare应该匹配2.txt中的(10) compare
  • 您必须使用 grep 的任何特殊原因?我不确定究竟您要做什么,但听起来 awk 会更合适。发布一些示例输入和预期输出会有很大帮助。

标签: shell scripting grep


【解决方案1】:

如果您希望只保留与模式匹配的结果,您可以简单地对输出进行后处理:

grep -vf 1.txt 2.txt | grep '([0-9]\+)' > 3.txt

或者,如果您希望仅使用 1.txt 中与比较模式匹配的行,您可以尝试:

grep -vf <(grep "([0-9]\+)" 1.txt) 2.txt > 3.txt

【讨论】:

  • 肖恩,列夫感谢您的回复。这正是我想要的: grep -vf 1.txt 2.txt | grep '([0-9]\+)' > 3.txt ... 但是我没有得到所有预期的结果[例如 (00001) 不起作用]。这个想法是从(0000)到(9999)的所有字符串
  • 如果您想将模式限制为 4 位,即 (0000) 到 (9999),请尝试 grep -E "\([0-9]{4}\)"
  • Shawn 我相信它不起作用。 1.txt ( (1) aaa, test, (03) test ) ... 2.txt ( (0003) bla, test3, (1111) ble ) ... 使用该正则表达式文件 3.txt 保持为空,当它应该有 (0003) bla 和 (1111) ble ...请注意 txt 文件的内容在不同的行
  • 恐怕我不明白你的要求。你能发布示例输入(1.txt2.txt)和你期望的输出吗?
  • 1.txt 有 abc, (0001) def, ghi .. 2.txt 有 jkl, (0001) def, (0007) xyz ...我希望 3.txt 只有 (0007 ) xyz 因为它有 ([0-9]) 并且它不在 1.txt 中
【解决方案2】:

简单的方法是:

在保存到 3.txt 之前,将结果通过管道传输到 grep -E '[0-9]+' &gt; 3.txt

看起来像: grep -vf.... |grep -E '[0-9]+' &gt; 3.txt

如果你给出一些 1.txt 、 2.txt 和预期的 3.txt 的例子,可能会有一个有效的方法。

【讨论】:

    【解决方案3】:

    这应该也可以:

    awk 'FNR==NR {arr[$0];next} !($1 in arr)' 1.txt 2.txt
    

    问候

    【讨论】:

      猜你喜欢
      • 2017-11-14
      • 1970-01-01
      • 2015-12-18
      • 2016-12-29
      • 2011-06-19
      • 2012-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多