使用perl或sed获取子字符串

Nxt*_*xt3 2 regex bash perl sed

我似乎无法正确获取子字符串。

declare BRANCH_NAME="bugfix/US3280841-something-duh";

# Trim it down to "US3280841"
TRIMMED=$(echo $BRANCH_NAME | sed -e 's/\(^.*\)\/[a-z0-9]\|[A-Z0-9]\+/\1/g')
Run Code Online (Sandbox Code Playgroud)

那仍然回来bugfix/US3280841-something-duh

如果我尝试使用perl代替:

declare BRANCH_NAME="bugfix/US3280841-something-duh";

# Trim it down to "US3280841"
TRIMMED=$(echo $BRANCH_NAME | perl -nle 'm/^.*\/([a-z0-9]|[A-Z0-9])+/; print $1');
Run Code Online (Sandbox Code Playgroud)

那什么也没输出。

我究竟做错了什么?

Pau*_*ges 6

仅使用bash参数扩展:

$: # don't use caps; see below.
$: declare branch="bugfix/US3280841-something-duh"
$: tmp="${branch##*/}"
$: echo "$tmp"
US3280841-something-duh
$: trimmed="${tmp%%-*}" 
$: echo "$trimmed"
US3280841
Run Code Online (Sandbox Code Playgroud)

意思是:

$: tmp="${branch_name##*/}"
$: trimmed="${tmp%%-*}" 
Run Code Online (Sandbox Code Playgroud)

分两步完成工作,而不会产生额外的过程。

sed

$: sed -E 's#^.*/([^/-]+)-.*$#\1#' <<< "$branch"
Run Code Online (Sandbox Code Playgroud)

这表示“在任何字符或没有字符后接斜杠后,请记住一个或多个非斜杠或破折号,然后是未记住的破折号,然后再输入任何或无字符,然后将整个输入替换为记住的部分。”

您原来的模式是

's/\(^.*\)\/[a-z0-9]\|[A-Z0-9]\+/\1/g'
Run Code Online (Sandbox Code Playgroud)

这说:“记住任何数量的任何内容,后跟斜杠,然后是小写字母或数字,然后是竖线字符(因为这些字符仅与-E一起使用),然后是大写字母或数字,然后是文字加号,然后将所有内容替换为您记住的内容。”

GNU的手册是您的朋友。我一直在寻找东西,以确保我做得对。有时候,我仍然需要尝试几次,大声笑。

旁白-尽量不要使用全大写字母的变量名。这是一个约定,表明它对操作系统很特殊,例如RANDOM或IFS。