gpt4 book ai didi

regex - Perl:匹配引号中包含斜杠的字符串

转载 作者:行者123 更新时间:2023-12-04 05:34:33 24 4
gpt4 key购买 nike

我目前正在编写一个 Perl 脚本来解析一个配置文件。语法如下

{command parameter1 parameter2}

其中第二个参数是可选的。首先我只想提取 { 之间的内容和 } .我正在使用此代码
while (<FILE>) {
chomp;
unless ($_ =~ m/^\/\//) {
$_ =~ /^\{(.*?)\}/s;
print $1;
}

而不是 print命令字符串将被进一步评估。我现在的问题是脚本只是停止处理某些字符串

只要参数周围有引号,脚本就可以工作。这
{exec sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new}

将返回括号之间的内容,但由于可能有第二个参数,现在很难区分没有引号的参数

其他字符串如
{exec "cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"}
{exec "/etc/init.d/ssh reload"}

工作完美,包括引号。

但是现在,引号中的字符串包括斜杠或加号(也可能是其他符号)在此时卡住 perl 脚本:
{exec "chmod +x /root/setSSHTimer.sh"}
{exec "sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new"}

都带引号。将第一个重写为“chmod 770 ...”时,它再次起作用。

任何想法是什么导致了这里的问题?

最佳答案

问题不在于您显示的代码,它只是提取了 {...} 之间的所有内容。大括号,但在评估的进一步代码中。如果您遇到问题,请发布此内容

请注意,您可以通过使用不同的分隔符和类似 next if m|^//| 的行来避免在正则表达式中转义斜杠。避免将循环的所有其余部分放在 if 中声明

解析命令行很笨拙 - 因为您必须处理包含在 "..." 中的参数和 '...'引号,允许在参数中使用转义引号 - 但可能

这是一个似乎可以正确解析所有示例数据的程序

use strict;
use warnings;

while (<DATA>) {

next if m|^//| or not /\S/;

if (/^\{(.*?)\}/) {
my $command = $1;
my @fields = $command =~ /'(?:\\'|[^'])*'|"(?:\\"|[^"])*"|\S+/g;
print join(' ', map "[$_]", @fields), "\n";
}
}

__DATA__
{exec sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new'}
{exec "cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"}
{exec "/etc/init.d/ssh reload"}
{exec "chmod +x /root/setSSHTimer.sh"}
{exec "sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new"}

输出
[exec] [sed] ['s/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new']
[exec] ["cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak"]
[exec] ["/etc/init.d/ssh reload"]
[exec] ["chmod +x /root/setSSHTimer.sh"]
[exec] ["sed 's/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new"]

更新

例如,此配置格式至少应拆分为多行,以便可以删除引号和转义符
exec
sed
s/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/ /etc/ssh/sshd_config > /etc/ssh/sshd_config.new

exec
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

exec
/etc/init.d/ssh reload

exec
chmod +x /root/setSSHTimer.sh

exec
sed
s/ClientAliveInterval\ 300/ClientAliveInterval\ 1800/\' /etc/ssh/sshd_config > /etc/ssh/sshd_config.new

这很容易正确输入和解析(尽管我确定您的最终 sed 示例是错误的!)

关于regex - Perl:匹配引号中包含斜杠的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138508/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com