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
Ну, единственная альтернатива, которую я смог придумать, это:
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! очень хорошо !
Вы можете сделать что-то вроде:
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;