Вот общий заголовок файлов bash.
#!/bin/bash
#
#####################################
# #
# {config_} #
# #
# ~/this_is_a very_very_very_long_filename
# #
# INSTALL VERSION #
# #
# §2023_06_18§ #
# #
# ¨version:50-0-1¨ #
# #
# ɸmodif_version:1-0-3ɸ #
# #
#####################################
#
# Applications configuration files
#
########################################################
#
#
#
########################################################
#
Я хочу заменить:
§2023_06_18§ #
# #
# ¨version:39-0-10¨
к
§2024_07_18§ #
# #
# ¨version:43-1-00¨
Начало блока – первый символ '§'. Конец блока — второй символ ¨.
Я очень мало знаю о sed
или Awk; но Awk мне кажется более понятным.
пожалуйста, обновите вопрос, указав код, который вы пробовали, и (неправильные) результаты, полученные вашим кодом
Комментарий: «Awk или Sed: заменить текст между специальными символами (разделителями) (3 ответа)» не имеет ничего общего с моим вопросом о многострочном поиске/замене.
Как я уже сказал, я очень мало знаю о sed или Awk; поэтому у меня нет кода, который можно было бы показать, потому что я не знал, как решить проблему. Извини.
Я добавил второй дубликат. Если вы не хотите изучать основы языка, о котором спрашиваете, Stack Overflow может не подойти вам.
Проблема X/Y. Теги даты и версии почти наверняка были созданы каким-то программным обеспечением. Здесь вы хотите установить новую версию. Вы не хотите редактировать сгенерированный контент, если только это не сознательное решение всей команды/организации навсегда отказаться от генератора. В противном случае кто-то снова воспользуется генератором и заблокирует ваши изменения.
[Я предполагаю, что вы действительно просто хотите изменить первый экземпляр в файле строк даты и версии, а остальная часть «блока» останется неизменной. Если это не так, поясните вопрос более подробным примером. ]
awk -v d='2024_07_18' -v v='version:43-1-00' '
d && sub(/§[0-9_]+§/, "§"d"§") {d=0}
v && sub(/¨version:[0-9-]+¨/, "¨"v"¨") {v=0}
1
' originalfile >newfile
d
и v
d
(v
) установлен, попробуйте заменить; не настроен на успехотрегулируйте два регулярных выражения, если значения могут содержать символы, отличные от тех, которые указаны в вопросе
вы также можете рассмотреть diff + patch
Было бы здорово, если бы вы объяснили d && sub(/§[0-9_]+§/, "§"d"§") {d=_}
@jhnc Кажется, это работает в двух тестах. Спасибо за помощь
@jcdole «если установлен d(v), попытаться заменить; в случае успеха сбросить» должно было быть объяснением. Я изменил назначение на d=0
согласно комментарию Эда.
@EdMorton Еще одна тонкость заключается в том, что если d или v изначально установлены в пустую строку или число, эквивалентное нулю, код ломается. Изначально я написал код с отдельными переменными-флагами !doned
, doned=1
и т. д., которые, хотя и казались более многословными, вероятно, были бы лучше во многих отношениях.
@jhnc правда, но я думаю, что вы, вероятно, можете с уверенностью предположить, что ни один из них не будет равен 0 или пуст.
Показанные вами данные не содержат
§2023_06_18§
.