【问题标题】:Grep words with spaces [duplicate]带空格的Grep单词[重复]
【发布时间】:2019-10-30 06:47:08
【问题描述】:

我有一个包含引号、逗号和空格的文本文件。

"'x','a b c'"
"'x','a b c','1','2 3'"
"'x','a b c','22'"
"'x','a b z'"
"'x','s d 2'"

但是,当我尝试使用 grep 提取完全匹配时,它不会显示结果。以下是我尝试使用的命令。

grep -E "\"\'x\'\,\'a\s\+b\s\+c\'\"" test.txt

预期输出:“'x','a b c'”

我错过了什么吗?任何帮助将不胜感激。

【问题讨论】:

  • 您希望获得的预期输出是什么。
  • 预期输出:“'x','a b c'”
  • 你想搜索什么来得到那个输出?
  • 你转义了+,它只匹配POSIX ERE中的文字加号。使用 \s+ 匹配 1 个或多个空格
  • @oguzismail 我认为this is relevant 在我们的讨论中:) 由于我对this comment 的反应而被问到。

标签: linux unix grep


【解决方案1】:

你很接近!几点说明:

  • 不要使用\s。它是一个 gnu 扩展,并非随处可用。最好使用字符类[[:space:]],或者真的只是 匹配一个空格。
  • \+ 可能具有误导性 - 在-E 模式下,它匹配文字+,而没有-E\+ 匹配一个或多个前面的字符。转义取决于您使用的模式。
  • 你不需要逃避一切!在" 双引号中,转义双引号"\"",不要转义双引号中的单引号和逗号,"\'\," 被解释为只是"',"

如果您只想将空格与grep -E 匹配:

grep -E "\"'x','a +b +c'\""

这很简单,不用-E,只需\+ 而不是+

grep "\"'x','a \+b \+c'\""

我喜欢把+前面的东西放在大括号里,帮助我阅读:

grep "\"'x','a[ ]\+b[ ]\+c'\""
grep -E "\"'x','a[ ]+b[ ]+c'\""

如果您想匹配ab 之间的空格和制表符,您可以在[ ]$'\t' 之间插入一个文字制表符:

grep "\"'x','a[ "$'\t'"]\+b[ "$'\t'"]\+c'\""
grep -E "\"'x','a[ "$'\t'"]+b[ "$'\t'"]+c'\""

但是有了grep -P,那会变成:

grep -P "\"'x','a[ \t]+b[ \t]+c'\""

但最好忘记\s,使用字符类[[:space:]]

grep "\"'x','a[[:space:]]\+b[[:space:]]\+c'\""
grep -E "\"'x','a[[:space:]]+b[[:space:]]+c'\""

【讨论】:

  • 如果 OP 实际上可能只使用带有 GNU grep 的正则表达式,你为什么不建议使用 \s?目前尚不清楚 OP 是否具有 GNU 或任何其他 grep,但我得出的结论是,尝试为 *NIX 工具提出“通用”解决方案是没有意义的,因为始终存在至少一个解决方案的环境不行。如果\s 适用于 OP(和我一样)我们可以使用它,为什么不呢?此外,grep -E "\"'x','a +b +c'\"" 在我的 Bash (GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)) 中不是有效的语法。你知道为什么吗?
  • 这是一个有效的观点。刚刚测试并在高山上使用busybox \s 匹配一个空格。 "\"'x','a +b +c'\"" - 我刚刚在我的旧机器上使用 bash4.2.24(1) 和 GNUgrep2.13 进行了测试,grep -E "\"'x','a +b +c'\"" <<<"\"'x','a b c'\"" 可以工作。那就不知道了。
猜你喜欢
  • 1970-01-01
  • 2022-01-13
  • 2020-07-28
  • 1970-01-01
  • 2018-12-13
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
相关资源
最近更新 更多