Замените значение переменной длины между двойными кавычками

Для этого не будет общего решения, потому что это не всегда возможно. Если у меня есть программа на C, blue.c, и я компилирую ее с помощью

cc blue.c -o green

, а затем запустите исполняемый файл green, не будет возможности определить, что имя источника было blue.c, за исключением судебно-медицинских мер, таких как поиск в моем каталоге. (Это утверждение верно по крайней мере для некоторых компиляторов C.)

2
11.08.2019, 14:20
2 ответа

Вы можете использовать [^"]*для сопоставления последовательности из нуля или более символов, отличных от -". Так

$ echo 'schedule="0.25"' | sed 's/"[^"]*"/"0.5"/'
schedule="0.5"
6
27.01.2020, 21:49

Похоже, вы просто хотите заменить все, что идет после знака равенства, на "0.50". Это легко сделать с помощьюawk:

$ echo 'schedule="0.25"' | awk -F = 'BEGIN { OFS=FS } $1 == "schedule" { $2 = "\"0.50\"" } { print }'
schedule="0.50"

Программа awkспециально ищет запись, чье первое=-поле с разделителями равно schedule. Когда он найден, он заменяет второе поле на "0.50".

Если 0.50является переменной, вы можете передать это значение в скрипт awkследующим образом:

$ newval=0.222
$ echo 'schedule="0.25"' | awk -v nv="$newval" -F = 'BEGIN { OFS=FS } $1 == "schedule" { $2 = sprintf("\"%s\"", nv) } { print }'
schedule="0.222"

И, очевидно, если scheduleтакже может меняться,

$ newval=0.222
$ variable=schedule
$ echo 'schedule="0.25"' | awk -v v="$variable" -v nv="$newval" -F = 'BEGIN { OFS=FS } $1 == v { $2 = sprintf("\"%s\"", nv) } { print }'
schedule="0.222"

С помощью sedвы можете просто проигнорировать все, что идет после =, и заменить его чем угодно:

$ echo 'schedule="0.25"' | sed 's/=.*/="0.50"/'
schedule="0.50"

Чтобы убедиться, что мы заменяем только значение для schedule, а не значение какого-либо другого параметра,

$ echo 'schedule="0.25"' | sed '/^schedule=/s/=.*/="0.50"/'
schedule="0.50"

Это ставит условие нашей замены; Строка должна иметь строку schedule=в начале, чтобы она сработала.

Мы могли бы даже вставить переменные оболочки в наше sedвыражение, но имейте в виду, что мы должны убедиться, что значения этих переменных не нарушают синтаксис sed(, поскольку содержат символы, влияющие на сопоставление или разграничение команд):

$ newval=0.222
$ variable=schedule
$ echo 'schedule="0.25"' | sed "/^$variable=/s/=.*/=\"$newval\"/"
schedule="0.222"

В отличие от примера awk, здесь мы полагаемся на оболочку для ввода значений наших переменных в sedсценарий редактирования. Обычно это классифицируется как уязвимость внедрения кода в тех случаях, когда значения переменных не находятся под нашим контролем (, например, когда мы считываем их из предоставленного пользователем источника ).

4
27.01.2020, 21:49

Теги

Похожие вопросы