Intento analizar mi cadena de entrada en un script awk
y 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, awk
en 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