8

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"

Stephen Walsh
  • 815
  • 4
  • 18
  • 34

4 Answers4

10

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
chepner
  • 497,756
  • 71
  • 530
  • 681
6

Possible use awk with - delimiter

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

-F - what field separator to use.

{print $2} - print second position

beliy
  • 445
  • 6
  • 13
3

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
anubhava
  • 761,203
  • 64
  • 569
  • 643
0

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

Community
  • 1
  • 1
Oleksii Zymovets
  • 690
  • 8
  • 14