【问题标题】:grep ignore characters in the patterngrep 忽略模式中的字符
【发布时间】:2015-05-14 07:01:13
【问题描述】:

模式来自长度为 14 的变量。该字符串是 grep 的模式。现在文本文件的每行包含 13 个字符。

例如长度为14的模式是

pattern =   58244804671021

文本文件包含

3823480467102
4724470467102

如何让 grep 忽略模式中的最后一个字符?

【问题讨论】:

  • 但是即使忽略最后一个字符,文件中也不存在5824480467102
  • 好吧,它可能包含也可能不包含。问题是关键字是 14 个字符,文件的行每行 13 个字符
  • 不清楚你在问什么,你能举个清楚的例子吗?
  • 输入是“这是搜索词”。现在我想让 grep 忽略最后一个字符。所以“这是搜索工作”

标签: regex unix command-line grep


【解决方案1】:

假设你的模式在$pattern 并且你正在使用 bash,你可以这样做

grep ${pattern%?} file

从变量中删除最后一个字符。

您也可以将cut 与字符 1 到 13 一起使用:

grep $(echo "$pattern" | cut -c 1-13 -) file

在 bash 和 ksh 中作为这里字符串甚至更好

grep $(cut -c 1-13 <<<$pattern) file

【讨论】:

    【解决方案2】:

    你的意思是这样的吗:

    cat file
    5824480467102
    4534324435455
    8244804671021
    

    所有行 = 13 字符

    pattern="58244804671021"
    

    模式 = 14 字符

    awk -v p="$pattern" '$1==substr(p,1,13)' file
    5824480467102
    

    这将删除模式的最后一个字符并针对字段#1 进行测试

    【讨论】:

      【解决方案3】:

      您可以使用参数扩展作为

      $ grep  ${pattern:0:13} filename
      

      来自 Bash 手册

      如果偏移量的计算结果小于零,则该值用作 参数值末尾的字符偏移量。如果 长度评估 指向小于零的数字,它被解释为从参数值末尾开始的字符偏移量,而不是 比一些字符 ters,扩展是偏移量和结果之间的字符。请注意,负偏移量必须与 结肠至少一个 空间以避免与 :- 扩展混淆。

      • ${variable:offset:lenght}

        • pattern是变量

        • 0偏移,或开始

        • 13长度

      测试

      $ cat input
      3823480467102
      4724470467102
      5824480467102
      
      $ grep  ${pattern:0:13} input
      5824480467102
      

      【讨论】:

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