На самом деле не один -лайнер, но вы можете сделать это одним вызовом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"
SubjectAlternativeName (SAN ), настроенный для клиентского сертификата, может быть не идеальным (, по крайней мере, если Client_Key
буквально соответствует тому, что вы использовали ). Лучше сделайте это адресом электронной почты или доменным именем. Затем настройте этот идентификатор как Локальный идентификатор на клиенте, чтобы он не использовал свой IP-адрес, что и происходит в настоящее время :
Sep 29 16:18:45 raspberrypi charon: 13[CFG] looking for peer configs matching 192.168.123.101[myDNSNAME]...94.109.49.167[10.218.49.167]