我嘗試使用和等多個特殊字元來解析腳本中的輸入字串,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