
grep -P
저는 awk를 처음 접했고 Perl이 지원되지도 설치되지도 않은 환경에서 다음을 수행 하려고 합니다 .
접두사로 시작하는 환경 변수 목록이 있는 경우 접두사를 사용하지 않고 이러한 변수를 기반으로 매개변수 목록을 생성하고 싶습니다.
예를 들어, 내가 가지고 있는 경우
PREFIX_VARIABLE_1=100
PREFIX_VARIABLE_2=500
생성하고 싶다
--set service.VARIABLE_1=100 --set service.VARIABLE_2=500
나는 그것을 알아
env | awk 'match($0, /PREFIX_.*/) { substr($0, RSTART+8, RLENGTH) ; split($0, parts, "=") ; printf "--set service.%s=%s ", parts[1], parts[2] }'
substr
그러나 그것은 사용되지 않은 접두사를 제거하지 않습니다.
그것으로 grep -P
나는 할 수 있다:
env | grep -oP '(?<=PREFIX_)(.*)' | awk 'split($0, parts, "=") { printf "--set service.%s=%s ", parts[1], parts[2] }'
여러 awk 함수를 올바르게 연결/파이프하는 방법에 대해 알고 계시나요? 감사해요
답변1
가독성을 위해 줄 바꿈이 포함된 코드
env | awk '
match($0, /PREFIX_.*/) {
substr($0, RSTART+8, RLENGTH)
split($0, parts, "=")
printf "--set service.%s=%s ", parts[1], parts[2]
}
'
substr
훌륭하게 작동합니다. 반환 값에 대해 아무 작업도 수행하지 않았습니다. substr 자체는 $0을 수정하지 않습니다.
PREFIX_VAR=something
먼저 정규식을 더 구체적으로 만들어서 대신 찾을 것을 제안합니다.some_other_var=$PREFIX_VAR
이제 PREFIX가 무엇인지 알았으니 RSTART 등을 사용할 필요가 없다고 제안합니다.
=
마지막으로 변수 이름 작업을 더 쉽게 하기 위해 필드 구분 기호 로 사용됩니다 .
env | awk -F= '$1 ~ /^PREFIX_/ {printf "--set service.%s=%s ", substr($1,8), $2}'
이 코드는 귀하의 코드와 마찬가지로 등호가 포함된 변수 값을 올바르게 처리하지 않습니다. awk에서 2..NF 필드를 연결하는 것은 약간 번거롭습니다.
env | awk '
function join (fstart, fend, separator, i, result) {
for (i = fstart; i <= fend; i++)
result = result $i (i == fend ? "" : separator)
return result
}
$1 ~ /^PREFIX_/ {
var = substr($1, 8)
value = join(2, NF, "=")
printf "--set service.%s=%s ", var value
}
'
답변2
cat file
대신 다음 명령을 사용하십시오 env
.
$ cat file | awk 'sub(/^PREFIX_/,"--set service."){out=out sep $0; sep=OFS} END{print out}'
--set service.VARIABLE_1=100 --set service.VARIABLE_2=500
답변3
이는 둘 중 하나를 사용하지 않고도 수행할 수 있습니다 awk
. 그냥 다른 방법을 보여줘
while read -r env
do
[[ $env == *PREFIX_* ]] && envs+=("--set service.${env#*_}")
done < <(env)
printf '%s ' "${envs[@]}"
따라서 여기서는 각 행을 읽고 를 PREFIX_
사용하여 배열 변수에 추가합니다 +=
. 다음 사항을 확인하세요 ${env#*_}
.
PREFIX_VARIABLE_1=100
~이 되다
VARIABLE_1=100
바라보다문자열 연산더 알아보기.