Analizar una cadena con varios caracteres de asterisco especiales

Analizar una cadena con varios caracteres de asterisco especiales

Intento analizar mi cadena de entrada en un script awky encontré algunas limitaciones con múltiples caracteres especiales como ***y +++.

Sin embargo, con el mismo script, con :::o ---como delimitadores, no tengo ningún problema.

Mi guión:

input=$1
delimiter=":::"

field2=$(echo "$input" | awk -F"$delimiter" '{print $2}')
field3=$(echo "$input" | awk -F"$delimiter" '{print $3}')
echo "field2=$field2"
echo "field3=$field3"

Salida con :::como delimitador:

bash-3.2$ ./parse_options.sh ":::sub  option::: Main option, still:bla:"
field2=sub  option
field3= Main option, still:bla:

Ahora, si intento usarlo ***como delimitador pero tengo otro aislado *en mi cadena, esto es lo que obtengo desafortunadamente: *bla*se cuenta como otro campo y eso no es lo que quiero:

bash-3.2$ ./parse_options.sh "***sub  option*** Main option, still*bla*"
field2=sub  option
field3= Main option, still

Como puedes ver, *bla*no aparece en el tercer campo, awken ese caso no se respeta el delimitador puesto.

Y ocurre lo mismo con +++un delimitador:

bash-3.2$ ./parse_options.sh "+++sub  option+++ Main option, still+bla+"
field2=sub  option
field3= Main option, still

Para más aclaraciones:

entrada =***sub option*** Main option, still*bla*

Salida esperada =

field2=sub  option
field3= Main option, still*bla*

Respuesta1

#!/bin/bash

input=$1
delimiter='\\*\\*\\*'

field2=$(echo "$input" | awk -F"$delimiter" '{print $2}')
field3=$(echo "$input" | awk -F"$delimiter" '{print $3}')
echo "field2=$field2"
echo "field3=$field3"

$ ./parse_options.sh "***sub  option*** Main option, still*bla*"
field2=sub  option
field3= Main option, still*bla*


Otras lecturas:

Respuesta2

¿Por qué no reemplazas *** o +++ por algún otro símbolo y luego usas ese símbolo como separador?

#!/bin/bash
input=$1

formatted_input=$(echo ${input} | sed "s/\*\*\*/\|/g;s/+++/\|/g")

field2=$(echo "${formatted_input}"  | awk -F\| '{print $2}')
field3=$(echo "${formatted_input}" | awk -F\| '{print $3}')
echo "field2=$field2"
echo "field3=$field3"

prueba esto...

$ echo "***test hello***hi test msg*this***" | awk -vFS='\\*\\*\\*' '{print "Field 2 : "$2;print "Field 3 : "$3}'
Field 2 : test hello
Field 3 : hi test msg*this

información relacionada