해당 문자열의 값을 기반으로 문자열을 명령의 출력으로 바꿉니다.

해당 문자열의 값을 기반으로 문자열을 명령의 출력으로 바꿉니다.

나는 sh:에서 스크립트를 작성하고 있습니다.

  • 구성 파일 읽기
  • {{ value_0000 }}검색 사이의 각 값에 대해0000
    • 0000매개변수로 전달된 값을 사용하여 명령을 실행합니다.
    • {{ value_0000 }}다음 으로 교체산출이 명령의

노트:

  • value_0000항상 숫자로 변환하세요.0000
  • 명령은 항상 동일합니다./bin/command <value>
  • 현재 구성 파일을 편집하고 싶지 않습니다. 메모리에서 실행할 수 있습니다.

예:

# this is a config file
key: {{ value_12345 }}:hello
something
another_key: return:{{ value_56789 }}/yeah

./run.sh

# this is a config file
key: returned-value:hello
something
another_key: return:another-returned-value2/yeah

구성 파일에서 값을 검색할 수 있지만 예상대로 작동하려면 더 많은 코드가 필요합니다.

#!/bin/sh
cat some.conf | while read line
do
   echo $line
   val="$(grep -o -P '(?<={{ value_).*(?= }})')"
   command $val
done

답변1

그리고 perl:

perl -pe 's(\{\{ value_(\d+) \}\})(`cmd $1`)ge' < some.conf

여기서는 쉘을 우회 $1하더라도 비어 있지 않고 쉘 구문에 특수 문자(숫자만)가 포함되지 않음이 보장 되므로 안전합니다 . perl그러나 \d+(하나 이상의 숫자 시퀀스)을 다른 것으로 변경하면 위험해지며(예: 와 같은 값의 경우 foo;reboot) 다음과 같이 더 안전한 접근 방식을 취할 수 있습니다.

perl -pe '
  s(\{\{ value_(.*?) \}\})(
    open my $fh, "-|", "cmd", $1 or die "cannot start cmd: $!";
    local $/ = undef;
    <$fh>;
  )ge' < some.conf

옵션이 허용되는 경우 ( 및 가능하면 )로 시작하는 값과 관련된 문제를 피하기 위해 또는 ( 옵션 끝 표시로 지원한다고 가정 ) 로 cmd바꿔야 할 수도 있습니다 ."cmd""cmd", "--"qw(cmd --)---+

어떤 경우 에라도,while read텍스트를 처리하기 위해 쉘 루프를 사용하지 않는 것이 가장 좋습니다.

답변2

match()에 대한 세 번째 인수를 일치시키려면 GNU awk를 사용하십시오.

$ cat tst.awk
match($0,/(.*{{ value_)([0-9]+)( }}.*)/,a) {
    cmd = "echo \"<foo_" a[2] "_bar>\""
    if ( (cmd | getline output) > 0 ) {
        $0 = a[1] output a[3]
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk some.conf
# this is a config file
key: {{ value_<foo_12345_bar> }}:hello
something
another_key: return:{{ value_<foo_56789_bar> }}/yeah

그리고 어떤 이상한 :

$ cat tst.awk
match($0,/{{ value_[0-9]+ }}/) {
    cmd = "echo \"<foo_" substr($0,RSTART+9,RLENGTH-12) "_bar>\""
    if ( (cmd | getline output) > 0 ) {
        $0 = substr($0,1,RSTART+8) output substr($0,RSTART+RLENGTH-3)
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk some.conf
# this is a config file
key: {{ value_<foo_12345_bar> }}:hello
something
another_key: return:{{ value_<foo_56789_bar> }}/yeah

관련 정보