Я должен заменить большой блок текста (код сценария оболочки) в файле другим блоком текста.
Я впечатлен, как я могу использовать sed для замены многострочной строки? ответили antak и Multi-line заменить ответили Брюс Эдигер
Но у меня есть некоторые проблемы с их использованием.
Antak уже упоминал в своем ответе, что потоковая передача всего file (
1h;2,$H;$!d;g;
) в буфер не рекомендуется для больших файлов, потому что это перегружает память.Я знаю,
sed
может использоваться с функцией блока, чтобы сохранить текст вне блока без изменений. Я хочу использовать эту функцию. Но если я использую,sed -i '/marker1/,/marker2/s/.*/new text (code)/' filename
он будет вставлять новый текст (код) повторно для каждого потока. Следовательно, я должен сделать визуальный блок одним потоком, используя что-то похожее на то, что предлагал ранее Antak , но для блока (не для всего файла).
Как упоминал Брюс Эдигер, можно добавить функцию добавления,
ex
начинающуюся сa
конца.
(точка), но мой новый текст (код) содержит строки, начинающиеся с точки, что можно рассматривать как синтаксис точки добавления. Как я могу использовать это в этой ситуации?ex
'sdd
' количество строк 'может удалить несколько строк, но если у меня есть блок между / marker1 / и / marker2 / с количеством строк не фиксированным (изменяющимся), должен быть заменен новым текстом (кодом), как это сделать Это ?
sed
илиex
команда).r
команду чтения файла, чтобы скопировать текст из другого файла, если исходный текст для замены находится в файле.Ответы:
Я предлагаю использовать с командой висящей (которая по существу d далить в сочетании с более ppend, хотя Append применяется только для последней строки в диапазоне , который является именно то , что вы хотите здесь):
Здесь используется
sed
синтаксис GNU для редактирования на месте (-i
). Вc
остальном эта команда стандартна и переносима. GNUsed
поддерживает:как нестандартное расширение.
Символы новой строки и обратной косой черты должны быть экранированы (с обратной косой чертой) в тексте замены.
источник
sed
и для обоихex
. Большое спасибо.sed
как в случае сex
синтаксисом, предложенным Брюсом Эдигером в многострочной замене .r
команду, описанную в других ответах на этот вопрос. Я не уверен, как вы будете использовать здесь документ сsed
.Использование GNU sed
Чтобы заменить строки, начинающие сопоставление строк
3
и продолжающие сопоставление строк5
сNew Code
:Для строк в диапазоне
/3/,/5/
мы проверяем, соответствует ли строка5
(имеется в виду, что это последняя строка в группе), и, если это так, мы делаем замену для вставкиNew Code
. Если подстановка была сделана, тоt
команда говорит sed перейти к концу команд (в этом случаеNew Code
печатается). Если нет,d
команда говорит sed удалить строку.Все остальные строки печатаются нормально.
Чтобы изменить файл на месте,
-i
можно использовать параметр:Использование awk
Чтобы сделать то же самое с помощью awk:
Команда awk обрабатывает строки в диапазоне
/3/,/5/
специально. Для строк в этом диапазоне мы проверяем,f
равен ли он нулю (то есть, является ли!f
оно истинным), и, если это так, мы печатаемNew Code
и устанавливаемf
в 1, а затем пропускаем остальные команды и переходим кnext
строке.Для линий вне диапазона
/3/,/5/
переход не выполняется, и это1
приводит к печати строки. Более подробно,1
это условие. Поскольку1
это не ноль, условие оценивается как истинное. Поскольку никакое действие не связано с условием, выполняется действие по умолчанию, которое заключается в печати строки. Таким образом,1
это сокращение для печати строки.Чтобы изменить файл на месте, эта
-i inplace
опция может быть использована с GNUawk
4.1 или выше:источник
awk
, не могли бы вы объяснить немного вашеawk
выражение лицаsed '/3/,/4/d;/5/cNew Code'
awk '/5/{print "New Code"}/3/,/5/{next}1'
Исходя из вышеизложенного, я придумаю решение, использующее
ex
Выше дает
Спасибо, g-man, чтобы я знал о команде изменения и дал разъяснения по поводу точки. Оба
sed
иex
имеют почти одинаковый синтаксис для команды изменения (также для команды удаления, команды добавления и т. Д.).источник