使用perl或sed获取子字符串

时间:2019-03-20 18:38:03

标签: regex bash perl sed

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

@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

什么都不输出。

我在做什么错了?

7 个答案:

答案 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:]]+)/;'