Кто-нибудь может увидеть, что я делаю неправильно?
Две вещи.
Во-первых, вы читаете весь файл за один раз (с -0777
), что означает, что вы теряете возможность легко распечатать один раздел из вашего файла.Лучше использовать -0175
, что восьмерично для "}".Таким образом, ваш код выполняется один раз для каждого раздела во входном файле.
Но он все равно не работает.Это из-за вашего регулярного выражения - /lease $ip \{.*?\}/
.Эта точка по умолчанию соответствует любому символу , за исключением новой строки .А так как ваши символы '{' и '}' всегда находятся на разных строках, это никогда не будет совпадать.
Вы можете добавить /s
в конец оператора соответствия, чтобы изменить значение .
чтобы соответствовать новой строке.Но я думаю, что проще просто усечь регулярное выражение, чтобы оно соответствовало только тому, что важно для вас - /lease $ip \{/
.На самом деле, я бы добавил ^
к началу, просто чтобы быть действительно уверенным.
Итак, наконец, мы заканчиваем этим:
$ ip="192.168.234.5"; perl -0175snle 'print if /^lease $ip \{/' -- -ip=$ip dhcpd.leases
lease 192.168.234.5 {
starts 3 2018/11/21 18:53:11;
ends 3 2018/11/21 18:54:11;
tstp 3 2018/11/21 18:54:11;
cltt 3 2018/11/21 18:53:11;
binding state free;
hardware ethernet 14:99:e2:04:52:5c;
uid "\001\024\231\342\004R\\";
}
, который, кажется, работает:-)