gpt4 book ai didi

regex - 使用带有否定先行断言的 grep

转载 作者:行者123 更新时间:2023-12-05 08:29:49 28 4
gpt4 key购买 nike

我有与这篇文章中完全相同的问题,但是正则表达式在 bash 中对我不起作用。 RegExp exclusion, looking for a word not followed by another

我想包含 csv 文件中包含单词“Tom”的所有行,但后面跟有“Thumb”的除外。

  • 包括:汤姆坐在海边。
  • 不包括:Tom Thumb 坐在海边。
  • 包括:Tom 和 Tom Thumb 坐在海边。

当我在 regex101.com 上试用时,正则表达式 Tom(?!\s+Thumb) 有效。

但我已经尝试了所有这些变体,但没有一个起作用。我错过了什么,我该如何解决这个问题?我在 Mac 上。

cat 输入文件.csv | grep Tom(?!\s+Thumb) > Tom.csv
猫输入文件.csv | egrep Tom(?!\s+Thumb) > Tom.csv
猫输入文件.csv | egrep “Tom(?!\s+Thumb)” > Tom.csv
猫输入文件.csv | grep -E Tom(?!\s+Thumb) > Tom.csv
猫输入文件.csv | grep -E “Tom(?!\s+Thumb)” > Tom.csv

最佳答案

您不能使用 POSIX ERE 执行此操作。

POSIX extended regular expressions 中没有否定先行断言,这是 grep -E 激活的语法。

最接近的是组合两个独立的正则表达式,一个正匹配和一个负匹配:

grep -we 'Tom' inputfile.csv | grep -wvEe 'Tom[[:space:]]Thumb'

grep -v 排除 匹配给定表达式的任何行;所以在这里,我们首先搜索 Tom,然后删除 Tom Thumb

但是,匹配 Tom and Tom Thumb sat by the seashore 的意图使得这不可行。简而言之:你不能用标准的 grep 做你想要的,除非它有 grep -P 来使你的原始语法有效。在这种情况下,您可以使用:

grep -Pwe 'Tom(?!\s+Thumb)' <inputfile.csv >Tom.csv

一个 hack 可能是一个临时替代品

假设您有可用的 uuidgen(它似乎存在于大苏尔)来生成一个临时的、不可预测的印记:

uuid=$(uuidgen)
sed -e "s/Tom Thumb/$uuid/g" <inputfile.csv \
| grep -we 'Tom' \
| sed -e "s/$uuid/Tom Thumb/g" >tom.csv

关于regex - 使用带有否定先行断言的 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67780479/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com