다음과 같은 문자열이 있습니다.
schedule="0.25"
0.25
나는 사용하고 싶다0.50
다음을 통해 이를 달성할 수 있습니다.
sed 's/\"....\"/\"0\.50\"/g'
문제는 큰 따옴표 사이의 값을 모르기 때문에 길이를 모른다는 것입니다. 임의의 값이 될 수 있지만 앞에는 항상 가 옵니다 schedule=
.
답변1
[^"]*
이를 사용하여 0개 이상의 비문자 시퀀스를 일치시킬 수 있습니다 "
. 그래서
$ echo 'schedule="0.25"' | sed 's/"[^"]*"/"0.5"/'
schedule="0.5"
답변2
등호 뒤에 오는 내용만 바꾸려는 것 같습니다 "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
편집 스크립트에 삽입합니다. 변수 값이 우리의 통제하에 있지 않은 상황(예: 사용자가 제공한 소스에서 읽는 경우)은 일반적으로 코드 주입 취약점으로 분류됩니다.
답변3
bash 스크립트/터미널에서 sed/awk를 호출하면 외부 도구 사용을 피하고 bash의 자체 문자열 처리 기능을 활용할 수 있습니다.
$ a='schedule="0.25"'
$ echo "$a"
schedule="0.25"
$ b="${a/\"*/\"0.50\"}"
$ echo "$b"
schedule="0.50"