Через очередь задач модуля rt.cpan.org/Public/Bug/Display.html?id=104000 указывает, что исправление {{ 1}} модуль (или, возможно, создание версии OpenSSL, не относящейся к RedHat) может быть подходящим вариантом. - thrig 4 часа назад
Ответ на комментарии thrig решил проблему, я видел этот билет раньше и проверял, был ли мой openssl скомпилирован с этой опцией, но вывод: "openssl version -a" не отображается. После нескольких часов тестирования попробовал этот патч.
.*
в назначениях переменных будет выполнять расширение имени файла(подстановку)&&
или неудачи ||
вместо if.REPL='something'
PATT='my line of text = '
FILE=conf_file.conf
cat $FILE
echo '========='
grep -q "^$PATT" $FILE && (sed -i "s/^$PATT.*$/$PATT$REPL/" $FILE) || (echo "$PATT$REPL" >> $FILE)
cat $FILE
На самом деле не один -лайнер, но вы можете сделать это одним вызовомsed
:
sed -e '
/pat/{s//repl/g;h;}
$!b
G
s/\n..*//;t
s/$/repl/
' yourfile
Н.Б. :Я намеренно использовал pat
и repl
для шаблона и замены соответственно, а не переменные оболочки, как вы сделали. В основном по двум основным причинам они будут мешать потоку кода sed + для корректности нам нужно цитировать оба, и при этом по-разному, чтобы они работали. Эту работу я оставляю вам.
Поток :Скажем, у файла никогда не было /pat/, тогда все строки переносятся в стандартный вывод командой $!b, а последняя строка при добавлении G просто видит пустое удержание поэтому t
не используется, и у нас есть операция добавления.
Когда мы видим линию /pat/, это значит, что она s/// -выделена и отмечена область удержания. если это не последняя строка, мы просто выходим на стандартный вывод. Для eof мы выполняем проверку удержания, и поскольку оно не -пусто (, предполагая, что repl
равно NONEMPTY
, тестовый путь будет выбран после удаления удержания из пространства шаблонов.
Perl
обеспечивает ясность соответствия слова намерения -для слова -в коде:
perl -lne '$a += s/pat/repl/g,print}{print q[repl] unless $a'
Читать как :Переменная $a
служит счетчиком количества замен. В конце мы будем добавлять в файл, если ранее не было создано ни одной подписки.
А что касается предоставления информации о шаблоне/замене через переменные, мы можем сделать это:
WHAT_I_WANT='my line of text = something'
WHAT_TO_REPLACE='my line of text =.*'
FILE_TO_EDIT=conf_file.conf
perl -li -sn -e '
$a += s/$pat/$repl/g,print}{print $repl unless $a
' -- -pat="$WHAT_I_WANT" -repl="$WHAT_TO_REPLACE" -- "$FILE_TO_EDIT"