【问题标题】:grep for a variable excluding the dot signgrep 用于不包括点号的变量
【发布时间】:2017-04-01 16:09:37
【问题描述】:

我想 grep 一个不包括以点号开头的变量。但是,为整个单词选择 -w 选项不包括点号,因此不仅选择 4 55 48,还选择 0.4 0.55 5.48。

例如$var=1565

输入

A 3.00027 1565    
B 3.00026 1565    
C -1.1565 5000 

想要的输出

A 3.00027 1565    
B 3.00026 1565

我已经看到grep 的解决方案,以获取以 grep 开头的确切模式,但这不适用于变量。

我已尝试在变量前添加一个空格符号,如下行所示,但它也没有提供所需的输出。

grep -E -w " $var" input.txt > output.txt #results in empty output
grep -E -w "[:space:]|$var" input.txt > output.txt # gives solutions that include the dot sign

【问题讨论】:

  • 您可能想阅读手册页,了解 -w 的作用以及它的作用和不匹配的内容。您还可以查看单词边界

标签: bash grep


【解决方案1】:

你可以试试:

grep -E "(^|\s)$var(\s|$)"

【讨论】:

  • 那也是空格?我的变量之后也没有空格,只有在我有制表符的变量之前,之后。
  • 按需修改,但解决方案是合理的。
  • (^|\s)$var 给了我文件中所有行的输出,我是否修改错误?
  • @katarina 此解决方案仅打印 $var 内容由空格(空格、制表符)包围或位于行首或行尾的行。所以,这是一个很好的解决方案,并在开始修改之前对其进行测试。从您的示例中,它选择所需的输出。
  • 我在没有修改的情况下测试过它,它给了我空的输出。我的文件肯定包含模式之前的空格和模式之后的制表符,所以我不知道问题可能出在哪里。但是感谢您向我解释它的含义,很高兴知道未来。
【解决方案2】:

因为我喜欢 perl 正则表达式,所以我会使用过于复杂的正则表达式:

grep -P "((?<=^)|(?<=\s))$var(?=(\s|$))"

即使使用-o,正则表达式也可以工作,并且只返回没有任何空格或类似空格的数字。 (使用非吸引组)

【讨论】:

    【解决方案3】:
    var=1565
    cat input.txt|uniq|grep -E ^[A-Z]+.*$var >output.txt
    

    在这里,创建一个模式并将其与 uniq 过滤行匹配。 匹配这些行的所需模式是 *1565。我只是将该模式存储在一个变量中。

    测试一下

    awk -F " " "{if(\$3==$var){print(\$0);}}" input.txt
    

    【讨论】:

    • 这不起作用,它仍然包含以点开头的模式。
    • 现在试试这个。您需要以大写字母开头并以 var 值结尾的行。是吗?
    • @katarina 你能发布你最坏的情况吗?
    • awk 呢?如果您知道列号,您可以轻松匹配
    • 只要 awk 就足够了。现在检查一下。
    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2015-03-18
    相关资源
    最近更新 更多