2010-01-21 3 views
0

У меня есть большая строка, которая представляет собой набор из key (space)+ value, то есть key, за которым следует одно или несколько пробелов, а затем value. Теперь мне нужно изменить value конкретного key, используя sed, awk, grep и т. Д. В unix окружающая среда.замените конкретное значение в строке значений ключа

например. строки: -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

Просто с Баш:

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" 
Смежные вопросы