Я пытаюсь проанализировать входную строку в скрипте awk
и столкнулся с некоторыми ограничениями при использовании нескольких специальных символов, таких как ***
и +++
.
Однако с тем же сценарием, с разделителями :::
или ---
без них, у меня не возникает никаких проблем.
Мой сценарий:
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"
Вывод с :::
разделителем:
bash-3.2$ ./parse_options.sh ":::sub option::: Main option, still:bla:"
field2=sub option
field3= Main option, still:bla:
Теперь, если я попытаюсь использовать ***
в качестве разделителя, но при этом *
в моей строке будут изолированные другие поля, вот что я, к сожалению, получу: *bla*
поле будет считаться другим, а это не то, что мне нужно:
bash-3.2$ ./parse_options.sh "***sub option*** Main option, still*bla*"
field2=sub option
field3= Main option, still
Как видите, *bla*
в третьем поле не отображается, в этом случае установленный разделитель awk
не соблюдается.
И то же самое с +++
разделителем:
bash-3.2$ ./parse_options.sh "+++sub option+++ Main option, still+bla+"
field2=sub option
field3= Main option, still
Для дополнительных разъяснений:
ввод=***sub option*** Main option, still*bla*
Ожидаемый результат=
field2=sub option
field3= Main option, still*bla*
решение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*
Дальнейшее чтение:
решение2
почему бы вам не заменить *** или +++ на какой-нибудь другой символ, а затем использовать этот символ в качестве разделителя?
#!/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"
попробуй это...
$ 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