Home > Back-end >  split string with regex expresion on bash dont work
split string with regex expresion on bash dont work

Time:06-22

I can split the next string

     1 - Tiendas HD StoreID,SellerID,Country,Flag,StoreName,Address,City,Latitude,Longitude,postalCode,state,localNumber,referenceLocation,businessUnit,fantasyName,legalName,alternativeId,assigneeDocumentNumber,assigneeDocumentType,assigneeEmail,assigneePhone,externalId,initHour,endHour,active,additionalData N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" 
                       2 - Tiendas RT StoreID,SellerID,Country,Flag,StoreName,Address,City,Latitude,Longitude,postalCode,state,localNumber,referenceLocation,businessUnit,fantasyName,legalName,alternativeId,assigneeDocumentNumber,assigneeDocumentType,assigneeEmail,assigneePhone,externalId,initHour,endHour,active,additionalData N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}"

I want split this string with by "$number -", example

"1 - text a"

Or

"1
2 - text b"

to take the follow result

"text a" 
"text b"

I have the next code

s=' 
             1 - Tiendas HD StoreID,SellerID,Country,Flag,StoreName,Address,City,Latitude,Longitude,postalCode,state,localNumber,referenceLocation,businessUnit,fantasyName,legalName,alternativeId,assigneeDocumentNumber,assigneeDocumentType,assigneeEmail,assigneePhone,externalId,initHour,endHour,active,additionalData N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}" 
                               2 - Tiendas RT StoreID,SellerID,Country,Flag,StoreName,Address,City,Latitude,Longitude,postalCode,state,localNumber,referenceLocation,businessUnit,fantasyName,legalName,alternativeId,assigneeDocumentNumber,assigneeDocumentType,assigneeEmail,assigneePhone,externalId,initHour,endHour,active,additionalData N001,1,Chile,Nike,Nike Las Condes,"Av. Pdte. Kennedy Lateral 9001, Las Condes, Región Metropolitana",Santiago,35.3333,21.2222,788977,Santiago,53A,frente al Easy,HD,Nike HD Kennedy,Nike LF Store LLC,N205,20833673‑8,RUT,[email protected],569888777,vtexnikeqa001,09:00,20:00,1,"{ propety1: 3272, propetyN: ""default"",}"'


#String
text=$s
input=$text
IFS='([0-9 ]*[-]  )|(\s\s [0-9 ]*[-]  )' array=($input)
for element in "${array[@]}"; 
do
    echo "--->  $element" ;
done

Replit https://replit.com/@JoseCastillo20/BASH#main.sh

CodePudding user response:

To split a string on regex pattern, would you please try the following:

#!/bin/bash

s='
     1 - text a
            2 - text b
'
pat='[[:space:]]*[0-9]  -'              # pattern to split on

# loop to split the string
while [[ $s =~ ^(.*)$pat(.*)$ ]]; do
    array =( "${BASH_REMATCH[2]%"${BASH_REMATCH[2]##*[![:space:]]}"}" )
    s="${BASH_REMATCH[1]}"              # update "s" with the remaining substring
done

# print the array elements
for (( i = ${#array[@]} - 1; i >= 0; i-- )); do
    echo "--->  ${array[$i]}"
done

Output:

--->   text a
--->   text b
  • The [[ $s =~ ^(.*)$pat(.*)$ ]] condition splits $s on the pattern $pat assigning ${BASH_REMATCH[1]} to the left substring and ${BASH_REMATCH[2]} to the right wrt the pattern. Due to the nature of longest match of regex, the last element ${BASH_REMATCH[2]} is determined first, while ${BASH_REMATCH[1]} still may contain other patterns to be matched.
  • Then s is updated with ${BASH_REMATCH[1]}, the left substring, and the while loop continues until no more matches remain.
  • ${BASH_REMATCH[2]%"${BASH_REMATCH[2]##*[![:space:]]}"} removes trailing space characters (whitespces, tabs, newlines, etc.) out of ${BASH_REMATCH[2]}.
  • As the array holds the elements in reverse order, the for loop prints the elements from the last to the first.

CodePudding user response:

$IFS is not interpreted as a regex, but as a list of characters.

  • Related