【问题标题】:Regex on Shell ScriptShell 脚本上的正则表达式
【发布时间】:2019-03-27 14:55:55
【问题描述】:

我有这个正则表达式,它完美地适用于https://regex101.com/(Python)上我想要的匹配模式。 问题是我需要将它集成到从 Windows 7 上的 GitBash 调用的 Shell 脚本中,但与我在线测试时相比,它没有按预期工作。

pattern='^([a-z][\-a-z0-9_/\.]*)?([A-Z]{3,10}\-[0-9]+([\-a-z0-9_/\.]+)?)?$'

用法示例:

if [[ ! $name =~ $pattern ]]; then ...

要匹配的字符串:

  • abc/this-is/my.test1
  • abc/ABC-12345
  • ABC-12345
  • ABC-12345/测试
  • ABC-12345/1.0
  • aabcd/ABC-123/1.0
  • abcd/abc-1234

要屏蔽的字符串:

  • abc/THIS-is/my.test1
  • 1.0/abc/this-is/my.test1
  • Abcd_10/ABCD-12345
  • ABCD-12345/ABC-123
  • abcd/ABCd-1234
  • abc/THISISAVERYLONGEXAMPLE-1234

我的 bash 版本

$ bash --version
GNU bash, version 4.4.19(2)-release (x86_64-pc-msys)
Copyright (C) 2016 Free Software Foundation, Inc.

有人可以帮助我吗? 谢谢!

【问题讨论】:

  • 您的模式即使在 Python 中也不起作用,请参阅 demo
  • GitBash 可以访问那些能够使用正则表达式过滤文本的 Unix 实用程序:grepsed(至少;我很确定 awk 也可用) .所以答案是这样滚动:1)停止“在线”测试东西; 2)编写一个最小的shell脚本,它只是逐行读取其输入,检查一行匹配并打印它,如果是的话; 3) 制作两个文本文件——一个包含必须匹配的行,另一个包含不能匹配的行; 4) 验证第一个文件中的所有行都通过了您的脚本,并且第二个文件中的所有行都没有。
  • 基本的基于 grep 的过滤循环类似于 this
  • @WiktorStribiżew 感谢您的观察。这是描述中的错字。我更正了:regex101.com/r/jHl8KQ/2
  • 原来是even worse

标签: regex bash shell scripting


【解决方案1】:

这只是 Python 和 GNU/Bash 之间的一点语法差异。

你只需要改变你的模式:

pattern='^([a-z][-a-z0-9_/\.]*)?([A-Z]{3,10}\-[0-9]+([-a-z0-9_/\.]+)?)?$'

最后,我只是删除了set开头的'-'前面的'\',例如[-a-z0-9_/.],而不是[- a-z0-9_/.]

【讨论】:

  • 我想你没问题吧?如果是这样,在 Stackoverflow 上,您可以将 up-vote 给人们有用的答案以感谢他们,并选择任何一个答案作为 correct answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2012-01-25
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
  • 2014-10-17
  • 2015-07-15
相关资源
最近更新 更多