Home > Back-end >  sed command: how to find and modify multiple patterns simultaneously?
sed command: how to find and modify multiple patterns simultaneously?

Time:04-06

I have a problem I need to address with bash and particularly sed. My data set is something like this:

Sims, J- PF 45
Samanic, L- PF 91
Noel, N- C 3

I need to end up with something like this:

uniform number for J. Sims: 45
uniform number for L. Samanic: 91

with a single sed command.

My initial tries were something like this:

sed -r 's/(.*), ([[:upper:]])- ([0-9] )/uniform number for \2. \1: \3/' nba_roster.txt

but I can't seem to get any matches for the number part. I managed to get the first name letter and the last name in an earlier version, but nothing combined with the number...

Any help? what am I doing wrong?

CodePudding user response:

Using sed

sed 's/\([^,]*\), \([A-Z]\)[^0-9]*\(.*\)/uniform number for \2. \1: \3/' input_file
uniform number for J. Sims: 45
uniform number for L. Samanic: 91
uniform number for N. Noel: 3

CodePudding user response:

It looks like you missed .* to match any text between - and the number:

sed -r 's/(.*), ([[:upper:]])-.* ([0-9] )/uniform number for \2. \1: \3/' nba_roster.txt
#                             ^^

You can also use

sed -E 's/^([^,] ), ([[:upper:]])[^0-9]*([0-9] ).*/uniform number for \2. \1: \3/' nba_roster.txt

See the online demo:

#!/bin/bash
s='Sims, J- PF 45
Samanic, L- PF 91
Noel, N- C 3'
sed -E 's/^([^,] ), ([[:upper:]])[^0-9]*([0-9] ).*/uniform number for \2. \1: \3/' <<< "$s"

Output:

uniform number for J. Sims: 45
uniform number for L. Samanic: 91
uniform number for N. Noel: 3

Pattern details

  • ^ - start of string
  • ([^,] ) - Group 1 (\1): any one or more chars other than a comma
  • , - a comma and space
  • ([[:upper:]]) - Group 2 (\2): an uppercase letter
  • [^0-9]* - zero or more non-digit chars
  • ([0-9] ) - Group 3 (\3): one or more digits
  • .* - the rest of the string (if any).
  • Related