Как заменить текст между двумя маркерами в файле на фрагмент текста из другого файла?

8

Скажем, у меня был блок текста в ~/.bashrc:

#~/.bashrc
# ...some commands...

# aliases
alias suicide='sudo rm -rf /'
# end aliases

# other commands

Я хочу заменить этот блок текста другим текстом, содержащимся между двумя маркерами в другом файле: stuff-to-place-in-bashrc.txt

# stuff-to-place-in-bashrc.txt
# ...stuff...

# aliases
alias ldir='ls * -d'
alias ithinklifeisworthliving='echo all good'
# end aliases

# ...more stuff...

я пробовал

 sed -ne 's/# aliases\s+\(.*\)\s+# end aliases/\1/' stuff-to-place-in-bashrc.txt

Но я действительно раскачиваюсь в темноте здесь. Может ли кто-нибудь помочь мне?

  1. Как извлечь текст из stuff-to-place-in-bashrc.txt?

  2. Как заменить другой раздел ~/.bashrcизвлеченным текстом из вопроса 1?

редактировать

Спасибо за обновления, ребята, те, кто интересуется, почему я хочу что-то вроде этого:

позволяет выбирать выбранные файлы сценариев без перезаписи дополнений, сделанных пользователем. полезен для общих и часто обновляемых стандартных операционных сред (например, моя последняя работа в Tyro , написанная на XP).

сойти с ума, ребята.

thenaglecode
источник
Также см. Захват текста между фигурными скобками в C-файле . Измените «фигурные скобки» с помощью маркеров начала и конца ( # aliasesи # end aliases), и это может сработать для вас.

Ответы:

9

Ed является стандартным редактором, потому что вы можете использовать его для разработки сценариев ed и позволить ему выполнять свою работу, как вы тестировали ранее, в интерактивном режиме. Для небольших файлов, таких как .bashrcили любой кодовый текст, ed является производительным, потому что он читает весь файл в один прием и работает с буфером. По той же причине вы не должны использовать ed для больших файлов, таких как файлы журналов.

Но с помощью сценария ed ваша работа будет выполнена в кратчайшие сроки:

ed ~/.bashrc<<EOF
/^# aliases
+,/^# end aliases/-1d
-r !sed -n '/^# aliases/,/^# end aliases/p' stuff-to-place-in-bashrc.txt|grep -v '^#'
w
q
EOF

Я использую аналогичные сценарии для автоматической настройки файлов конфигурации, например, alas .asoundrc для различных сред, в которых я использую свой ноутбук.

Лучший документ об ed - это простая справочная страница из очень классной системы PLAN9 . Я перевел это в постскриптумный документ ed.ps. Если вы заинтересованы в PLAN9, вы должны проверить 9front и http://cat-v.org/ поскольку оригинальная версия все еще поддерживается, но имеет очень простую файловую систему.

Последнее слово о войнах редакторов, emacs, vim и т. П .: Правила acme!

ikrabbe
источник
Спасибо за ответ, это сработало, однако я не уверен, что синтаксис. Использует ли он регулярное выражение или что-то более специфичное для ed? похоже, что есть команды vim like ( w, q)
thenaglecode
Он использует регулярные выражения ( /^# aliases, и /^# end aliases/), а остальные команды Vi / Ed. См., Например, vimhelp.appspot.com/cmdline.txt.html#%3Arange для +, /^# end aliases/.
Муру
1
увидеть info Edв вашей системе (надеюсь). Я не знаю, почему современные дистрибутивы Linux не устанавливают этот классный редактор. w и q - команды записи и выхода. И ed работает очень похоже на sed с регулярными выражениями. Есть причина, почему названия звучат так схоже. d означает удаление адресных строк, -r читает в предыдущую строку результаты !следующей команды. Я сокращаю имена файлов при редактировании, так как я так ленив, печатая этим ранним утром.
Икраббе
1
@thenaglecode смотрите мое последнее редактирование. Я должен был проверить это прежде, чем я отправил это.
Икраббе
1
@thenaglecode Единственной действительно хорошей страницей о ed, которая мне когда-либо была нужна, была страница ed (1) из plan9: man.cat-v.org/plan_9/1/ed. Я могу прислать вам постскриптную версию, если хотите. Поскольку мы только что говорили о plan9, см. Также редактор acme. Если вы привыкнете к этому, вы никогда не будете использовать что-то другое. Конечно, лучше всего использовать систему plan9, например, как виртуальную машину внутри вашего linux-бокса, но порт p9p для unix тоже хорош. (Есть небольшие различия между plan9 ed и gnu ed!)
ikrabbe
2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Если вы хотите редактировать файл на месте ed, это очень хорошее решение. Если вы хотите редактировать его в потоке, используйте sed. Избегайте sed -i.

mikeserv
источник
0

Конечно, вы можете сделать это edсамостоятельно, без дополнительных инструментов:

ed -s stuff_to_place.txt<<\IN
1,/# aliases/d
/# end aliases/,$d
,d
.r /home/username/.bashrc
/# aliases/x
.t.
.,/# end aliases/-d
,p
q
IN

если вы довольны результатом, замените ,pна, w /home/username/.bashrcчтобы записать изменения в ~/.bashrc(обратите внимание на полный путь, используемый с rи w; вы можете просто использовать, .bashrcесли он есть cwd).
Как это работает: мы сначала dвыбираем ненужные строки из stuff_to_place.txt. Затем мы удаляем остальные (псевдонимы) с помощью ,d. Теперь текстовый буфер пуст, а буфер обрезки содержит нужные нам строки. Затем мы rдобавляем содержимое .bashrcв текстовый буфер, помещаем содержимое буфера обрезки ( x) после /# aliases/строки, дублируем последнюю вставленную строку ( .t.), затем удаляем из дублированной строки до, но не включая /# end aliases/и, наконец, pринту или wобряд изменения и qуит.

don_crissti
источник