Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get substring using either perl or sed

Tags:

regex

bash

sed

perl

I can't seem to get a substring correctly.

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')

That still returns bugfix/US3280841-something-duh.

If I try an use perl instead:

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');

That outputs nothing.

What am I doing wrong?

like image 355
Nxt3 Avatar asked Jan 01 '26 07:01

Nxt3


1 Answers

Using bash parameter expansion only:

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

Which means:

$: tmp="${branch_name##*/}"
$: trimmed="${tmp%%-*}" 

does the job in two steps without spawning extra processes.

If you prefer actual regex -

$: [[ "$branch" =~ /([[:alnum:]]+) ]] && echo ${BASH_REMATCH[1]}
US3280841

In sed,

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

This says "after any or no characters followed by a slash, remember one or more that are not slashes or dashes, followed by a not-remembered dash and then any or no characters, then replace the whole input with the remembered part."

Your original pattern was

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

This says "remember any number of anything followed by a slash, then a lowercase letter or a digit, then a pipe character (because those only work with -E), then a capital letter or digit, then a literal plus sign, and then replace it all with what you remembered."

GNU's manual is your friend. I look stuff up all the time to make sure I'm doing it right. Sometimes it still takes me a few tries, lol.

An aside - try not to use all-capital variable names. That is a convention that indicates it's special to the OS, like RANDOM or IFS.

like image 150
Paul Hodges Avatar answered Jan 03 '26 03:01

Paul Hodges



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!