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)
那什么也没输出。
我究竟做错了什么?
仅使用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。
| 归档时间: |
|
| 查看次数: |
102 次 |
| 最近记录: |