Для этого не будет общего решения, потому что это не всегда возможно. Если у меня есть программа на C, blue.c
, и я компилирую ее с помощью
cc blue.c -o green
, а затем запустите исполняемый файл green
, не будет возможности определить, что имя источника было blue.c
, за исключением судебно-медицинских мер, таких как поиск в моем каталоге. (Это утверждение верно по крайней мере для некоторых компиляторов C.)
Вы можете использовать [^"]*
для сопоставления последовательности из нуля или более символов, отличных от -"
. Так
$ echo 'schedule="0.25"' | sed 's/"[^"]*"/"0.5"/'
schedule="0.5"
Похоже, вы просто хотите заменить все, что идет после знака равенства, на "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
сценарий редактирования. Обычно это классифицируется как уязвимость внедрения кода в тех случаях, когда значения переменных не находятся под нашим контролем (, например, когда мы считываем их из предоставленного пользователем источника ).