【问题标题】:replace a particular value in a string of key - values替换键值字符串中的特定值
【发布时间】:2011-01-07 15:10:10
【问题描述】:

我有一个大字符串,它是key (space)+ value 的集合,即key 后跟一个或多个空格,然后是value。 现在我需要在unix 环境中使用sed, awk, grep 等更改特定keyvalue

例如。字符串:-Key1 Value1 -Key2 Value2 -Key3 Value3

我需要一个与上面相同的新字符串,只有Value2 将替换为NewValue3

【问题讨论】:

    标签: bash string sed awk


    【解决方案1】:

    只需使用 bash:

    str="-Key1 Value1 -Key2 Value2 -Key3 Value3"
    set -- $str  # variable is not quoted to allow for word splitting
    new=""
    while [[ -n "$1" ]]
    do
      case "$1" in
      -Key2) val="newval2" ;;
      *) val="$2" ;;
      esac
      new="$new $1 $val"
      shift 2
    done
    str="$new"
    

    【讨论】:

      【解决方案2】:
      echo "-Key1 Value1 -Key2 Value2 -Key3 Value3" | \
          sed -r -e "s/(-Key2\s+)([^-\s]+)(\s+)/\1<newvale>\3/g"
      -Key1 Value1 -Key2 <newvale> -Key3 Value3
      

      【讨论】:

        【解决方案3】:

        试试这个

        #!/bin/bash
        read -p "What is your key?: " key
        read -p "What is new value?: " value
        echo "-Key1 Value1 -Key2 Value2 -Key3 Value3" | awk -vk="$key" -vv="$value" -F"-"  '
        {
            for(i=1;i<=NF;i++){
                if($i ~ k){
                    $i=k" "v" "
                }
            }
        }1 ' OFS="-"
        
        $ ./shell.sh
        What is your key?: Key2
        What is new value?: NewVal2
        -Key1 Value1 -Key2 NewVal2 -Key3 Value3
        

        【讨论】:

          【解决方案4】:

          如果我理解正确的话:

          sed -e 's/\(.*\)\(-Key2\)\(  *\)\([^ ]*\)\( .*\)/\1\2\3NewValue3\5/'
          

          应该这样做。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-06-08
            • 2019-04-12
            • 1970-01-01
            • 1970-01-01
            • 2022-01-15
            • 1970-01-01
            • 1970-01-01
            • 2020-01-31
            相关资源
            最近更新 更多