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

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

Я пытаюсь проанализировать входную строку в скрипте 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

Связанный контент