Bash: substring from first occurrence of a character to the second occurrence

13.7k Views Asked by At

In bash, how do I get a substring of everything from the first occurrence of a character to the second occurrence of the same character.

Example...

Input String = "abc-def-ghi"

Character = "-"

Desired Output String = "def"

4

There are 4 best solutions below

0
On BEST ANSWER

Possible use awk with - delimiter

echo "abc-def-ghi" | awk -F'-' '{print $2}'

-F - what field separator to use.

{print $2} - print second position

0
On

I would use two parameter expansions.

str="abc-def-ghi"
tmp=${str#*-}  # Remove everything up to and including first -
result=${tmp%%-*} # Remove the first - and everything following it
0
On

Let's say you have:

s="abc-def-ghi"
ch='-'

Using BASH read builtin:

IFS="$ch" read -ra arr <<< $s && echo "${arr[1]}"

Or, using BASH regex:

re="$ch([^$ch]*)$ch"

[[ $s =~ -([^-]*)- ]] && echo "${BASH_REMATCH[1]}"

Output:

def
0
On

Why not just use cut command like this:

str="abc-def-ghi"

echo $str | cut -f 2 -d "-"

, where -d option is a delimiter and -f option stands for fragment number (the first fragment number is 1, not 0 as it is common for arrays).