代码之家  ›  专栏  ›  技术社区  ›  ADEpt

KSH脚本:当值已转义逗号时,如何在“”上拆分?

  •  1
  • ADEpt  · 技术社区  · 16 年前

    我尝试编写KSH脚本来处理一个由名称-值对组成的文件,每行有几个名称-值对。

    NAME1 VALUE1,NAME2 VALUE2,NAME3 VALUE3, etc
    

    假设我写:

    read l
    IFS=","
    set -A nvls $l
    echo "$nvls[2]"
    

    这将给我第二个名字-值对,很好,很容易。现在,假设任务已扩展,因此值可以包含逗号。他们应该像这样逃走:

    NAME1 VALUE1,NAME2 VALUE2_1\,VALUE2_2,NAME3 VALUE3, etc
    

    我一直使用没有“读取数组”的旧ksh。我尝试了各种各样的技巧,如“read-r”和“eval set-A…”,但都没有成功。我不能使用“read nvl1 nvl2 nvl3”在read内部进行取消跳过和拆分,因为我事先不知道每行中有多少个名称-值对。

    有没有人能给我一个有用的窍门?

    附言

    2 回复  |  直到 16 年前
        1
  •  1
  •   ADEpt    16 年前

    正如经常发生的那样,在公共论坛上提问几分钟后,我得到了一个答案:(

    sed -e 's/\([^\]\),/\1\
    /g;s/$/\
    /
    

    它将输入转换为:

    NAME1.1 VALUE1.1
    NAME1.2 VALUE1.2_1\,VALUE1.2_2
    NAME1.3 VALUE1.3
    <empty line>
    NAME2.1 VALUE2.1
    <second record continues>
    

    while read name value ; do
      echo "$name => $value"
    done
    

    值的逗号将不被“read”引用,如果愿意,我可以将“name”和“Value”填充到一些关联数组中。

    附言 既然我不能接受自己的答案,我应该删除这个问题,还是。。。?

        2
  •  0
  •   Bill Karwin    16 年前

    \,

    read l
    l=${l//\\,/!!}
    IFS=","
    set -A nvls $l
    unset IFS
    echo ${nvls[2]/!!/,}