Analisar uma string com vários caracteres especiais de asterisco

Analisar uma string com vários caracteres especiais de asterisco

Tento analisar minha string de entrada em um script awke encontrei algumas limitações com vários caracteres especiais como ***e +++.

Porém, com o mesmo script, com :::ou ---como delimitadores, não tenho nenhum problema.

Meu roteiro:

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"

Saída com :::delimitador:

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

Agora se eu tento usar ***como delimitador mas tenho outro isolado *na minha string, eis o que recebo infelizmente: o *bla*é contado como um outro campo e não é isso que eu quero:

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

Como você pode ver, *bla*não aparece no terceiro campo, o delimitador configurado awknão é respeitado nesse caso.

E é a mesma coisa +++como delimitador:

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

Para maiores esclarecimentos:

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

Resultado esperado =

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

Responder1

#!/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*


Leitura adicional:

Responder2

por que você não substitui *** ou +++ por algum outro símbolo e então usa esse 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"

tente isso...

$ 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

informação relacionada