我尝试使用和等多个特殊字符来解析脚本中的输入字符串,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