Я пытаюсь проанализировать свою входную строку в сценарии с помощью 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
Для дальнейших пояснений:
input = *** подопция *** Основная опция, по-прежнему * bla *
Ожидаемый результат =
field2=sub option
field3= Main option, still*bla*
#!/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*
Дополнительная литература:
почему бы вам не заменить *** или +++ на какой-нибудь другой символ, а затем использовать этот символ в качестве разделителя
#!/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