2010-01-21 47 views
0

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

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

我需要一个新的字符串,它是一样的只是Value2上面会通过NewValue3

回答

1
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 
0

被替换如果我理解正确你:

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

应该这样做。

0

试试这个

#!/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 
0

只需使用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"