【问题标题】:grep to find specific results in a text file around | regular expressions?grep 在文本文件中查找特定结果 |常用表达?
【发布时间】:2013-02-14 23:33:15
【问题描述】:

我无法理解一些正则表达式。我正在尝试在文本文件中搜索 2 个竖线字符之间的特定字段,例如

|nope|target|tree|
|target|nope|nah|

我会使用什么样的 grep 正则表达式来只返回第一行?更具体地说,仅在第二个字段中找到“目标”

【问题讨论】:

  • 这绝对是 awk 的工作,而不是 grep。使用 grep 不可能简单地匹配字段中的字符串,因为 grep 需要使用 RE 来查找字段,并且它不能在同一命令行中同时进行 RE 匹配和字符串匹配。请参阅@Kent 的回答。

标签: linux grep expression


【解决方案1】:

打印第二个字段为目标的行:

kent$  echo "|nope|target|tree|
|target|nope|nah|"|awk -F'|' '$3=="target"'
|nope|target|tree|

【讨论】:

    【解决方案2】:

    这个问题有点不清楚,但我猜你想要这样的东西:

    grep '|.*|target|.*|' my_file.txt
    

    【讨论】:

    • 这将在第一个和最后一个之后的任何字段中匹配“目标”,而不仅仅是在第二个。我知道样本只有 3 个字段,但我不认为 3 字段文件实际上是 OP 询问的唯一情况。它还存在将目标匹配为 RE 而不是字符串的问题,请参阅我在@steve 的回答中发布的评论。
    • 当然,但这取决于输入格式规范。如果输入字段可能包含转义的管道符号,这也是不够的。如果 OP 对格式没有更具体的说明,则无法知道在编写正则表达式时需要注意多少。另外,我不明白您的其他评论:管道符号未转义,因此 grep 将其作为普通字符进行匹配。
    • 我不确定你在最后指的是哪个评论,但如果它是关于 RE 与字符串,则不是管道符号被视为 RE 有很大问题,而是字段中的文本。
    • @EdMorton:我不明白,文字匹配得很好。请提供解释或链接,否则看起来您只是在传播 FUD。
    • 我不知道 FUD 是什么意思,但尝试在您的输入文件中搜索特定的字符串“tar.et”并注意到 grep 与“target”不正确匹配,因为它正在进行 RE 比较,而不是字符串比较。要使用 grep 匹配字符串,您需要使用 fgrep 但是您不能使用 RE 来描述要跳过的前导字段,因此您会被困在一块石头和一个坚硬的地方.
    【解决方案3】:

    要匹配第二个字段:

    grep "^|[^|]*|target|" file
    

    结果:

    |nope|target|tree|
    

    解释:

    ^          # match start of line
    |          # a pipe symbol
    [^|]*      # anything not a pipe symbol any number of times
    |          # a pipe symbol
    target     # the word 'target'
    |          # a pipe symbol
    

    【讨论】:

    • 匹配的不是'target'这个词,而是正则表达式'target'。如果你想匹配,说“a.com”并且文件包含“a.com”但也包含“abcom”,这很重要。请注意,上面所写的内容也会错误地匹配“定位”。
    • @EdMorton:哦,尾管……完成了。都是正则表达式。这应该是显而易见的。
    • 这适用于这种特殊情况,但通常您必须将其设为 ([|]|$),以防目标字段是该行的最后一个字段,然后您必须切换到egrep 并转义其他管道符号。您还需要在 () 中包围的第一个 RE 段之后添加一个 {N} 以跳过一般情况下的 N 个前导字段,然后您仍然会遇到问题,即您匹配的是 RE 而不是目标中的字符串场地。当 grep 不适合这项工作并且在 awk 中微不足道时,这一切都变得毫无意义。
    • @EdMorton:我完全同意。肯特的回答应该被接受。他只是打败了我。添加 grep 解决方案以防 OP 感兴趣。谁知道?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2014-07-23
    • 2012-07-24
    • 2023-02-18
    • 1970-01-01
    相关资源
    最近更新 更多