【问题标题】:compare text (with dashes) using regex shell script使用正则表达式 shell 脚本比较文本(带破折号)
【发布时间】:2013-02-15 19:28:21
【问题描述】:

我想检查我的变量是否有这种格式--- foobar---> <some other stuff> 也就是说,我想知道文字是否以--- foobar --->开头

所以我使用了grep -q,但得到了这个错误:

$echo "---  foobar---> subtree " | grep -q "--- fooobar--->*" 
grep: unrecognized option `--- fooobar--->*'
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

(这是OSXgrep's version is:

$ grep --v
grep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

)

如何重写我的正则表达式以匹配预期的字符串?

谢谢。

【问题讨论】:

  • 您能澄清一下您期望 * 采取什么行动吗?现在,正如它所写的那样,您告诉它在最后将您的字符串与 0 个或多个 '>' 匹配。如果你的意思是你的表达式后面的任何字符,它看起来像这样。"--- fooobar--->.*"
  • 作为辅助评论,您可以在 [www.regexlib.com](www.regexlib.com) 上构建和测试正则表达式
  • 刚刚添加了说明。我想检查文本是否以--- foobar ---> 开头
  • 如果你想检查它是否以它开头,那么我建议它阅读“^--- foobar --->”这将检查你的文本是否以 foobar 开头。我正在查找 '>' 是一个特殊字符,它可能需要使用 '\' 进行转义,然后看起来像这样 "^--- foobar ---\>"
  • 我使用 regexlib.com 正则表达式测试器确认 > 不需要转义。我接下来建议使用 F.J 关于 -e 选项的答案。那应该解决它。但是,如果您要查看一行是否以您的模式开头,请记住在表达式的开头添加一个“^”

标签: regex grep


【解决方案1】:

您可以通过在正则表达式之前添加-e 来修复错误:

grep -q -e "--- fooobar--->*"

来自手册页:

 -e PATTERN, --regexp=PATTERN
        Use PATTERN as the pattern; useful to protect patterns beginning with -.

至于正则表达式本身,正则表达式中的* 表示“重复前一个字符零次或多次”,因此您的正则表达式检查--- fooobar---,然后检查零个或多个> 字符。

如果要匹配任意数量的任意字符,请改用.*

grep -q -e "--- fooobar--->.*"

但是,由于看起来您只是在检查该行是否匹配,所以最后的 .* 并没有真正改变任何东西,如果您完全删除它,它的行为会相同。

您可能还想在模式的开头添加^,这是行锚的开头,这样您就不会匹配像“其他内容... --- fooobar--- > 巴兹”。

【讨论】:

  • 您可能需要更新最后一种情况的答案。他正在寻找模式的“开始”。所以在模式的开头添加一个'^'。我意识到这只是整体答案中的一小部分,只是为了确保答案的完整性。但我同意。为您的解决方案 +1。
猜你喜欢
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 2015-09-17
  • 1970-01-01
  • 2019-03-27
  • 1970-01-01
  • 2013-03-29
相关资源
最近更新 更多