【发布时间】:2021-05-31 21:38:38
【问题描述】:
我的问题与这篇文章完全相同,但是 bash 中的正则表达式对我不起作用。 RegExp exclusion, looking for a word not followed by another
我想包含包含单词“Tom”的 csv 文件的所有行,除非它后面跟着“Thumb”。
- 包括:汤姆坐在海边。
- 不包括:Tom Thumb 坐在海边。
- 包括:汤姆和大拇指汤姆坐在海边。
当我在 regex101.com 上试用时,正则表达式 Tom(?!\s+Thumb) 有效。
但是我已经尝试了所有这些变体,但都没有奏效。我错过了什么,我该如何解决这个问题?我在 Mac 上。
cat inputfile.csv | grep Tom(?!\s+Thumb) > Tom.csvcat inputfile.csv | egrep Tom(?!\s+Thumb) > Tom.csvcat inputfile.csv | egrep “Tom(?!\s+Thumb)” > Tom.csvcat inputfile.csv | grep -E Tom(?!\s+Thumb) > Tom.csvcat inputfile.csv | grep -E “Tom(?!\s+Thumb)” > Tom.csv
【问题讨论】:
-
请注意,
grep -E只保证 ERE 语法。\s是 PCRE;根据您使用的grep的特定版本,它可能会起作用,也可能不会起作用。据我所知,?!根本不支持 任何 ERE 实现。 -
(有些平台有一个支持 PCRE 的
grep,但您需要在您的特定目标操作系统上检查man grep;通常,它是grep -P以启用该功能)。跨度> -
另外,请注意
grep不是 bash 的一部分——它是一个单独的工具,由不同的团队构建,编译为不同的可执行文件。 bash 确实有自己的机制来访问标准 C 库正则表达式功能,但是当您使用 grep 时,您并没有使用 bash 的正则表达式支持——而是使用 grep 的。 -
另外,请注意复制/粘贴到问题中的代码使用
“和”。这些不被 bash 识别为有效的引号。您必须仅使用常规双引号 --"-- 才能将它们识别为 shell 语法。如果您使用的某些软件打开了“智能引号”,请务必在使用该程序编辑 shell 脚本之前将其关闭。 -
(请注意,仅知道您使用的是 Mac 并不能告诉我们您拥有的
grep的版本,因为 Mac 用户可以使用 Nix、Macports 等工具安装自己的 grep 版本, 或 Homebrew -- 按我个人偏好的降序排列)