заменить определенное значение в строке ключевых значений - PullRequest
0 голосов
/ 21 января 2010

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

например. из строки: -Key1 Value1 -Key2 Value2 -Key3 Value3

Мне нужна новая строка, такая же, как указано выше Value2 будет заменена на NewValue3

Ответы [ 4 ]

1 голос
/ 21 января 2010
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 голосов
/ 21 января 2010

Просто с 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"
0 голосов
/ 21 января 2010

попробуйте

#!/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 голосов
/ 21 января 2010

Если я вас правильно понял:

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

должен это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...