我似乎无法正确获取子字符串。
@Html.ListBox("userRoles", new SelectList(ViewBag.Roles, "RoleID", "RoleName"), new { @class = "form-control" })
那仍然返回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')
。
如果我尝试使用perl代替:
bugfix/US3280841-something-duh
什么都不输出。
我在做什么错了?
答案 0 :(得分: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
意思是:
$: tmp="${branch_name##*/}"
$: trimmed="${tmp%%-*}"
分两步完成工作,而不会产生额外的过程。
在sed
中,
$: sed -E 's#^.*/([^/-]+)-.*$#\1#' <<< "$branch"
这表示“在任何字符或没有字符后接斜杠后,记住一个或多个不是斜杠或破折号,然后是未记住的破折号,然后再输入任何或无字符,然后将整个输入替换为记住的部分”。
您的原始图案是
's/\(^.*\)\/[a-z0-9]\|[A-Z0-9]\+/\1/g'
这说:“记住任何数量的任何内容,后跟斜杠,然后是小写字母或数字,然后是竖线字符(因为那些仅与-E一起使用),然后是大写字母或数字,然后是文字加号,然后将其全部替换为您记住的内容。”
GNU的manual是您的朋友。我一直在寻找东西,以确保我做得对。有时候,我还是需要尝试几次,大声笑。
除了-尽量不要使用全大写字母的变量名。这是一个约定,表明它对操作系统很特殊,例如RANDOM或IFS。
答案 1 :(得分:1)
您可以使用此sed
:
sed -E 's~^.*/|-.*$~~g' <<< "$BRANCH_NAME"
US3280841
此awk
:
awk -F '[/-]' '{print $2}' <<< "$BRANCH_NAME"
US3280841
答案 2 :(得分:1)
sed 's:[^/]*/\([^-]*\)-.*:\1:'<<<"bugfix/US3280841-something-duh"
答案 3 :(得分:1)
Perl版本的+
放在错误的位置。它应该在捕获括号内:
TRIMMED=$(echo $BRANCH_NAME | perl -nle 'm/^.*\/([a-z0-9A-Z]+)/; print $1');
答案 4 :(得分:0)
只需在^
之前使用A-Z0-9
TRIMMED=$(echo $BRANCH_NAME | sed -e 's/\(^.*\)\/[a-z0-9]\|[^A-Z0-9]\+/\1/g')
在您的sed
案中。
或者短暂地,您可以使用
TRIMMED=$(echo $BRANCH_NAME | sed "s/[a-z\/\-]//g" )
也是。
答案 5 :(得分:0)
在外壳终端上输入
$ BRANCH_NAME="bugfix/US3280841-something-duh"
$ echo $BRANCH_NAME| perl -pe 's/.*\/(\w\w[0-9]+).+/\1/'
使用s(替代)命令代替m(匹配)
perl是sed的超集,因此它是相同的'sed -E'而不是'perl -pe'
答案 6 :(得分:0)
使用 Perl正则表达式字符类的另一种变体(请参见perldoc perlrecharclass
)。
echo $BRANCH_NAME | perl -nE 'say m/^.*\/([[:alnum:]]+)/;'