Perl Negative Lookbehind с обходом переменной длины?

Tuve el mismo problema (no se proporcionó ninguna salida )y fue porque el tiempo de espera predeterminado (5 segundos )era demasiado corto. Resolví esto usando el indicador T -que me permite establecer mi propio tiempo de espera personalizado (en segundos ). Ejemplo ilustrativo con tiempo de espera de 240 segundos y dirección IP aleatoria:

ssh-keyscan -T 240 52.213.86.118
0
28.05.2019, 16:55
2 ответа

Ну, единственная альтернатива, которую я смог придумать, это:

FILESECTION="\
        #    parameter=10
#    parameter=10
#  parameter=10
        parameter=10
parameter=10
"

newfile=''
while IFS= read -r line ; 
    do 

    SECTIONFIXED=$( perl -le '$file=$ARGV[0]; $file=~ s/^(?!#+$)(\s*)(parameter\s*=.*)/parameter=replaced/g; print("$file\n");' "${line}" ; ) 
    newfile=$( printf "${newfile}\n${SECTIONFIXED}\n" )  
done <<< "$FILESECTION"

echo "$newfile" 

Выход:

        #    parameter=10
#    parameter=10
#  parameter=10
parameter=replaced
parameter=replaced

Мы должны использовать '^(?!#+$)(\s*)'отрицательный просмотр вперед построчно. И он принимает переменную длину (, может быть, потому, что это не многострочная строка? еще не знаю.)

Я натолкнулся на эту идеюhttps://www.regextester.com/95226и, наконец, воплотил ее в жизнь.

Сегодня я узнал кое-что новое. Надеюсь, вы найдете это полезным!

ПС. мы также могли бы использовать простой ([^#]*), предложенный terdon https://unix.stackexchange.com/a/521512/354415, который предложил в основном ту же концепцию, что и здесь, но реализованную в Perl one liner! очень хорошо !

0
28.01.2020, 02:40

Вы можете сделать что-то вроде:

s/#.*|((?<!\S)parameter\h*=.*)/$1 ? "parameter=replaced" : $&/ge;

Идея состоит в том, что #.*(, которое мы заменяем на себя ), сожрет все комментарии. И во второй части чередования мы ищем ваш образец (здесь parameter=...при условии, что ему не предшествует не -пробел )в том, что осталось.

Другой подход заключается в использовании:

s/^[^#\n]*\K(?!<\S)parameter\h*=.*/parameter=replaced/gm;

\Kустанавливает начало заменяемой детали. Флаг mустанавливает соответствие ^в начале каждой строки внутри субъекта.

Если эти parameter=можно найти только в начале строк (, за которыми следуют необязательные пробелы ), то это просто:

s/^\h*\Kparameter\h*=.*/parameter=replaced/gm;
1
28.01.2020, 02:40

Теги

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