複数の特殊アスタリスク文字を含む文字列を解析する

複数の特殊アスタリスク文字を含む文字列を解析する

スクリプトで入力文字列を解析しようとしましたが、や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*3 番目のフィールドには表示されません。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

関連情報