在参数中拆分字符串(使用sed / awk)

时间:2012-05-08 11:06:18

标签: shell unix scripting ksh tokenize

环境:KornShell(ksh)

我想将下面的字符串分开:

-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK

输出应该是(-UP之后的字符串应保留为单个标记):

-ssRMDFXXRT 
-rtETL 
-ltDAILY 
-sD20120203 
-lfRS 
-UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" 
-QqDESKTOP 
-Ln9999 
-XmXMLBLOCK

我尝试了很多但无法获得预期的输出,但现在我觉得我需要一些帮助。请帮忙。

3 个答案:

答案 0 :(得分:1)

for arg in "$@"; do printf '<%s>\n' "$arg"; done

这会遍历所有参数,并且不会破坏空格中的参数。

答案 1 :(得分:0)

krithika.542> echo "-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK" | perl -pe 's/ /\n/g'
-ssRMDFXXRT
-rtETL
-ltDAILY
-sD20120203
-lfRS
-UPEffTimeStamp=20110203-210000#InputCtxNm=Forigen
Exchange
Today#RunType=EOD
-QqDESKTOP
-Ln9999
-XmXMLBLOCK
krithika[ncm_o12.0_int.cctcsvibh].543> 

答案 2 :(得分:0)

你必须使用eval来使shell尊重引用的参数

$ str='-ssRMDFXXRT -rtETL -ltDAILY -sD20120203 -lfRS -UP"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" -QqDESKTOP -Ln9999 -XmXMLBLOCK'
$ arr=($str); echo ${#arr[@]}
11
$ arr=("$str"); echo ${#arr[@]}
1
$ eval arr=($str); echo ${#arr[@]}
9

然后按行显示:printf "%s\n" "${arr[@]}"
你会注意到双引号已经从“复杂”论证中消失了。

但是,你的初始字符串不是"$*"对吗?如果是,请改用"$@"