Какой самый краткий способ вставить или обновить строку? [дубликат]

Через очередь задач модуля rt.cpan.org/Public/Bug/Display.html?id=104000 указывает, что исправление {{ 1}} модуль (или, возможно, создание версии OpenSSL, не относящейся к RedHat) может быть подходящим вариантом. - thrig 4 часа назад

Ответ на комментарии thrig решил проблему, я видел этот билет раньше и проверял, был ли мой openssl скомпилирован с этой опцией, но вывод: "openssl version -a" не отображается. После нескольких часов тестирования попробовал этот патч.

2
11.08.2017, 18:40
2 ответа
  • Использование очень длинных имен переменных для замены длинных строк является ИМО контрпродуктивно.
  • Для расширения переменных в командах grep/sed используйте двойные кавычки.
  • Использование подстановочных знаков .*в назначениях переменных будет выполнять расширение имени файла(подстановку)
  • Следующий скрипт использует условное выполнение в случае успеха &&или неудачи ||вместо 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
1
27.01.2020, 22:09

На самом деле не один -лайнер, но вы можете сделать это одним вызовом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"
1
27.01.2020, 22:09

Теги

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