Analisa uma string com vários caracteres especiais de asterisco

0

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

No entanto, com o mesmo script, com ::: ou --- como delimitadores, não tenho nenhum problema.

Meu script:

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 ::: como delimitador:

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

Agora, se eu tentar usar *** como um delimitador, mas tiver outros * isolados em minha string, aqui está o que recebo, infelizmente: o *bla* é contado como outro campo e não é o 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 definido em awk não é respeitado nesse caso.

E é a mesma coisa com +++ como um delimitador:

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

Para mais esclarecimentos:

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

Saída esperada =

field2=sub  option
field3= Main option, still*bla*
    
por Djidiouf 27.10.2016 / 05:08

2 respostas

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


Outras leituras:

por 27.10.2016 / 08:03
1

por que você não substitui o *** ou o +++ por outro símbolo, então use 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
    
por 27.10.2016 / 05:46