Заменить несколько последовательных строк одной строкой с помощью sed

Если ваш сервис можно активировать через сокет, вы можете использовать Accept=yesв блоке сокетов. Тогда новый экземпляр вашей службы будет выполняться для каждого соединения и останавливаться при закрытии сокета.

1
05.01.2021, 14:53
2 ответа

Для редактирования файла используйте текстовый редактор с поддержкой сценариев, например Ed или Ex(оба редактора POSIX ). Синтаксис очень похож.

printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'w' 'q' | ed -s file
printf '%s\n' '/^import matplotlib as mpl$/d' 's/mpl/plt' 'x' | ex file
  • printf '%s\n'передает команды редактору.

  • /^import matplotlib as mpl$/dудаляет первую строку, соответствующую шаблону.

  • s/mpl/pltвыполняет замену на следующей строке.

  • wи qили xсохраняют изменения.

Если ты действительно хочешь Сэда,

sed '/^import matplotlib as mpl$/N; s/.*\nmpl/plt/' file

Ответ на ваш расширенный вопрос:

find /path/to/dir/ -type f -exec sh -c '
    printf "%s\n" "/^import matplotlib as mpl\$/d" "s/mpl/plt" "w" "q" |
    ed -s "$1"' sh {} \;
5
18.03.2021, 22:38

Если это не обязательно sed, вы можете использовать awkдля задачи:

awk '$0=="import matplotlib as mpl" {buf=$0; next}
     buf {if (/^mpl\.style\.use/) {sub(/^mpl/,"plt")} else {print buf}; buf=""} 1' inputfile
  • Когда встретится строка, точно читающая import matplotlib as mpl, она сохранит ее в буфере bufи пропустит выполнение до следующей строки.
  • Если установлена ​​переменная буфера и текущая строка начинается с mpl.style.use, она заменит эту часть текущей строки на plt.style.useи отбросит содержимое буфера.
  • Если установлена ​​переменная буфера, но текущая строка не соответствует шаблону «вторая строка», перед печатью текущей строки будет напечатано содержимое буфера. После этого буфер очищается.
  • Для всех строк, встречающихся при пустом буфере, мы просто печатаем строку как есть.

Если вам требуется более точное соответствие второй строки, измените второе правило на

buf {if ($0=="mpl.style.use(mpl_plt_default_template)" {sub(/^mpl/,"plt")} else {print buf}; buf=""}
3
18.03.2021, 22:38

Теги

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