【问题标题】:Parse String to Tokens in Unix在 Unix 中将字符串解析为标记
【发布时间】:2012-05-16 02:44:51
【问题描述】:

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

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

结果应该是:

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

请指教。

【问题讨论】:

    标签: unix sed grep replace


    【解决方案1】:

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

    sed 's/^"//; s/=/="/g; s/#/"\n/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"
    

    【讨论】:

      【解决方案2】:

      你用的是什么外壳?对于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[@]}"
      

      【讨论】:

        【解决方案3】:

        or and 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
        

        我希望这会有所帮助。

        【讨论】:

        • @Shelter : 如果参数列表不同,如何打印?例如“EffTimeStamp=20110203-210000#InputCtxNm=Forigen Exchange Today#RunType=EOD#RegionName=US#InstruID=9999.....”
        【解决方案4】:

        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
        

        【讨论】:

          猜你喜欢
          • 2023-03-05
          • 2016-01-19
          • 1970-01-01
          • 1970-01-01
          • 2017-03-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-26
          相关资源
          最近更新 更多