Regex bash中的简单正则表达式

Regex bash中的简单正则表达式,regex,bash,sed,Regex,Bash,Sed,以我的生命来说,我无法找出这不起作用的原因: Regex = /\/(.*?)_/ String = hotfix/ABC-181_some_text_here 。。。这是可行的,但我不能在bash中使用它: ISSUE_ID=$(sed 's/\/(.*?)_/\1/g' <<< $CURRENT_HEAD) echo "$ISSUE_ID" // outputs nothing 实例: 您的正则表达式对sed无效。小问题是捕获组使用反斜杠括号\…\;空括号是文字

以我的生命来说,我无法找出这不起作用的原因:

Regex = /\/(.*?)_/

String = 
hotfix/ABC-181_some_text_here
。。。这是可行的,但我不能在bash中使用它:

ISSUE_ID=$(sed 's/\/(.*?)_/\1/g' <<< $CURRENT_HEAD)

echo "$ISSUE_ID" // outputs nothing
实例:


您的正则表达式对sed无效。小问题是捕获组使用反斜杠括号\…\;空括号是文字

更重要的问题是sed不识别非贪婪限定符?关于像*这样的量词。您可以通过更明确的方式来解决这一问题,而不是在下划线之前使用任何字符的最短序列,您可以明确地要求使用非下划线序列,如下所示:

sed 's,/\([^_]*\)_,\1,g'
我还将分隔符从/改为,;sed不在乎你使用什么角色,这避免了一点点的错误

现在应该匹配,但它只替换与模式匹配的字符串部分。如果你想扔掉之前和之后的所有东西,那么你必须让模式匹配整个字符串。最简单的方法是在任意一侧添加。*:

sed 's,.*/\([^_]*\)_.*,\1,g'
您还可以使用-E启用扩展正则表达式,其中包括翻转反斜杠和非反斜杠括号的含义。它仍然不能为您提供贪婪限定符,但它可以让您使用更少的反斜杠:

sed -E 's,.*/([^_]*)_.*,\1,g'

您的正则表达式对sed无效。小问题是捕获组使用反斜杠括号\…\;空括号是文字

更重要的问题是sed不识别非贪婪限定符?关于像*这样的量词。您可以通过更明确的方式来解决这一问题,而不是在下划线之前使用任何字符的最短序列,您可以明确地要求使用非下划线序列,如下所示:

sed 's,/\([^_]*\)_,\1,g'
我还将分隔符从/改为,;sed不在乎你使用什么角色,这避免了一点点的错误

现在应该匹配,但它只替换与模式匹配的字符串部分。如果你想扔掉之前和之后的所有东西,那么你必须让模式匹配整个字符串。最简单的方法是在任意一侧添加。*:

sed 's,.*/\([^_]*\)_.*,\1,g'
您还可以使用-E启用扩展正则表达式,其中包括翻转反斜杠和非反斜杠括号的含义。它仍然不能为您提供贪婪限定符,但它可以让您使用更少的反斜杠:

sed -E 's,.*/([^_]*)_.*,\1,g'

我假设您想将hotfix/ABC-181\u这里的一些文本\u转换为ABC-181。您的代码有一些问题:

它使用Perl风格的正则表达式,而不是sed正则表达式 替换只会删除/和u 幸运的是,您甚至不需要正则表达式:

# remove everything up to first '/'
ISSUE_ID="${CURRENT_HEAD#*/}"
# remove everything after '_'
ISSUE_ID="${ISSUE_ID%%_*}"

有关详细信息,请参阅。

我假设您希望将hotfix/ABC-181\u此处的一些文本\u转换为ABC-181。您的代码有一些问题:

它使用Perl风格的正则表达式,而不是sed正则表达式 替换只会删除/和u 幸运的是,您甚至不需要正则表达式:

# remove everything up to first '/'
ISSUE_ID="${CURRENT_HEAD#*/}"
# remove everything after '_'
ISSUE_ID="${ISSUE_ID%%_*}"

有关详细信息,请参阅。

我不知道您使用的是什么操作系统,也不知道它随附的是什么sed变体,但我注意到您的正则表达式似乎包含一个非贪婪的*修饰符,sed可能不支持该修饰符。请注意,sed不是bash,不同版本的sed安装在FreeBSD、OS X、Linux Cygwin或HP/UX上,所有这些都可以运行bash

如果您要查找的输出是ABC-181,则可以使用:

$ CURRENT_HEAD="hotfix/ABC-181_some_text_here"
$ ISSUE_ID=$(sed -E 's:.*/([^_]+).*:\1:g' <<<"$CURRENT_HEAD")
$ echo "$ISSUE_ID"
ABC-181

我不知道您使用的是什么操作系统,也不知道它附带的是sed的什么变体,但我注意到您的正则表达式似乎包含了一个非贪婪的*修饰符,sed可能不支持这个修饰符。请注意,sed不是bash,不同版本的sed安装在FreeBSD、OS X、Linux Cygwin或HP/UX上,所有这些都可以运行bash

如果您要查找的输出是ABC-181,则可以使用:

$ CURRENT_HEAD="hotfix/ABC-181_some_text_here"
$ ISSUE_ID=$(sed -E 's:.*/([^_]+).*:\1:g' <<<"$CURRENT_HEAD")
$ echo "$ISSUE_ID"
ABC-181

例如,如果您的grep知道-p,您可以使用PCRE


例如,如果您的grep知道-p,您可以使用PCRE


显示实际的$git符号ref-short-q头output@RomanPerekhresthotfix/ABC-181_某些_text_此处您的代码引用了一个未定义$CURRENT_HEAD的变量,显示了对Regex和String的无效赋值,使用了未显示的输入数据。。。请确保显示实际的代码,即不输出任何内容(包括Bash中的错误消息)的代码。@Fred更新了说明您使用的是哪个版本的sed?您确定不需要转义括号吗?显示实际的$git symbolic ref-short-q HEADoutput@RomanPerekhresthotfix/ABC-181_某些_text_此处您的代码引用了一个未定义$CURRENT_HEAD的变量,显示了对Regex和String的无效赋值,使用了未显示的输入数据。。。请确保显示实际的代码,即不输出任何内容(包括Bash中的错误消息)的代码。@Fred更新了说明您使用的是哪个版本的sed?你确定你不需要跳过括号吗?谢谢,但它所做的只是
刚刚从输出中删除了所有的/,仅此而已。@3zzy它还应该删除zy。如果这不是你想要的,你需要修正你的问题。如果你只想得到括号中的部分,扔掉字符串的其余部分,这也不同于你原来的正则表达式。查看我的编辑是否有帮助。从hotfix/project-1229_reports-results-post-shows-all-post-results-而不是-selected-project,我需要提取project-1229谢谢,但它所做的只是从输出中删除了所有的/,仅此而已。@3zzy它还应该删除了!。如果这不是你想要的,你需要修正你的问题。如果你只想得到括号中的部分,扔掉字符串的其余部分,这也不同于你原来的正则表达式。查看我的编辑是否有帮助。从hotfix/project-1229_reports-results-post-shows-all-post-results-in-the-selected-project中,我需要提取project-1229