スクリプトで入力文字列を解析しようとしましたが、や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