값을 큰따옴표 사이의 가변 길이로 바꿉니다.

값을 큰따옴표 사이의 가변 길이로 바꿉니다.

다음과 같은 문자열이 있습니다.

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"

관련 정보