在Unix中将字符串解析为标记

时间:2012-05-07 15:22:46

标签: unix sed grep replace

我想解析一个字符串(使用awk / sed / grep):

"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD"

结果应该是:

EffTimeStamp="20110203-210000"
InputCtxNm="Forigen Exchange Today"
RunType="EOD"

请告知。

4 个答案:

答案 0 :(得分:1)

需要几个不同的替换,但sed可以做到这一点。

sed 's/^"//; s/=/="/g; s/#/"\n/g'

e.g。

% echo '"EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD"' | 
    sed 's/^"//;s/=/="/g;s/#/"\n/g'
EffTimeStamp="20110203-210000"
InputCtxNm="Forigen Exchange Today"
RunType="EOD"

答案 1 :(得分:0)

你使用的是什么外壳?对于bash,你可以写

str="EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD"
oifs=$IFS
IFS="#"
set -- $str
IFS=$oifs
printf "%s\n" "$@"

输出

EffTimeStamp=20110203-210000
InputCtxNm=Forigen Exchange Today
RunType=EOD

如果您不想使用位置参数,可以将值存储为数组:

arr=($str)
printf "%s\n" "${arr[@]}"

答案 2 :(得分:0)

awk 解决方案

 echo "EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" \
 |  awk -F# -v OFS="\n" '{for (i=1;i<=NF; i++) printf("%s%s", $i, (i==NF ? "\n" : OFS)) }'

<强>输出

EffTimeStamp=20110203-210000
InputCtxNm=Forigen Exchange Today
RunType=EOD

我希望这会有所帮助。

答案 3 :(得分:0)

使用perl修改$/(输入记录分隔符)和$\(输出记录分隔符)的一种简单方法:

echo -e "EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD" | 
perl -pe 'BEGIN { $/ = q[#]; $\ = qq[\n] }'

输出:

EffTimeStamp=20110203-210000#
InputCtxNm=Forigen Exchange Today#
RunType=EOD