Разбор строки с несколькими специальными символами звездочки

Я пытаюсь проанализировать свою входную строку в сценарии с помощью 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*
0
27.10.2016, 06:15
2 ответа
#!/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*


Дополнительная литература:

1
28.01.2020, 02:34

почему бы вам не заменить *** или +++ на какой-нибудь другой символ, а затем использовать этот символ в качестве разделителя

#!/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
1
28.01.2020, 02:34

Теги

Похожие вопросы