나는 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 --)
--
-
+
답변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