Tento analisar minha string de entrada em um script awk
e 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 awk
nã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