Заменить строку выводом команды на основе значения этой строки

I have an http server on my Solaris 11 system and I want to block all http requests from other systems.

Предполагая, что вы хотите разрешить доступ только с самого фактического хоста веб-сервера, самый простой способ сделать это — просто настроить веб-сервер для прослушивания 127.0.0.1:80или localhost:80вместо чего-то вроде 0.0.0.0:80или 192.168.1.211:80.

1
19.02.2020, 18:30
2 ответа

С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
28.04.2021, 23:22

С GNU awk для соответствия 3-го аргумента():

$ 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

и с любым awk:

$ 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
0
28.04.2021, 23:22

Теги

Похожие вопросы