Como substituir texto entre dois marcadores em um arquivo com uma seção de texto de outro arquivo?

8

Digamos que eu tenha um bloco de texto no ~/.bashrc :

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

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

# other commands

Desejo substituir esse bloco de texto por outro texto contido entre dois marcadores em outro arquivo: 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...

Eu tentei

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

Mas eu estou realmente balançando no escuro aqui. Alguém poderia me ajudar?

  1. Como extraio o texto do stuff-to-place-in-bashrc.txt ?

  2. Como substituo a outra seção em ~/.bashrc pelo texto extraído da pergunta 1?

Editar

Obrigado pelos caras da atualização, aqueles que se perguntam por que eu gostaria de algo assim:

allows for cherry-picked updates to script files without overwritting user-made additions. useful for shared and frequently updated standard operating environments (like my last job at Tyro that coded with XP).

Enlouquem-se.

    
por thenaglecode 25.06.2015 / 05:07

3 respostas

9

Ed é o editor padrão, porque você pode usá-lo para desenvolver scripts ed e deixá-lo fazer o seu trabalho, como você testou antes, de forma interativa. Para arquivos pequenos como .bashrc ou qualquer texto de código, o ed tem desempenho porque lê todo o arquivo de uma só vez e trabalha com o buffer. Pelo mesmo motivo, você não deve usar o ed para arquivos grandes, como arquivos de log.

Mas com um script ed, seu trabalho é feito em pouco tempo:

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

Eu uso scripts semelhantes para ajustar automaticamente os arquivos de configuração, como o assoundrc para diferentes ambientes para os quais levo meu laptop.

O melhor documento sobre ed vem de uma simples página de manual do muito bom sistema PLAN9 . Traduzi-o para um documento de postscript ed.ps . Se você está interessado em PLAN9 você deve verificar 9frente e link , pois a versão original do Bell Labs ainda é mantida, mas tem um sistema de arquivos muito simples.

Uma palavra final sobre guerras de editores, emacs, vim e afins: regras do acme!

    
por 25.06.2015 / 05:27
2
set /^\#aliases/  /^\#end\ aliases/
sed -ne"$1,$2"'s/\\{0,1\}/&&/gp' <stuff_to_place...rc |
sed -e"$1,$2c\" -f- ./infile >./outfile

Se você quiser editar o arquivo no local, ed é uma boa solução muito . Se você quiser editá-lo in-stream, use sed . Evite sed -i .

    
por 25.06.2015 / 08:04
0

Claro, você pode fazer isso com ed sozinho, sem necessidade de ferramentas adicionais:

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

se estiver satisfeito com o resultado, substitua ,p por w /home/username/.bashrc para gravar as alterações em ~/.bashrc (observe o caminho completo usado com r e w ; você pode simplesmente usar .bashrc se estiver em cwd ).
Como isso funciona: primeiro d elete as linhas desnecessárias de stuff_to_place.txt . Em seguida, excluímos os restantes (os aliases) com ,d . O buffer de texto está agora vazio enquanto o buffer de corte contém as linhas que queremos. Em seguida, r leva o conteúdo de .bashrc para o buffer de texto, coloca o conteúdo do buffer de corte ( x ) para depois da linha /# aliases/ , duplica a última linha que foi colada ( .t. ) exclua da linha duplicada até, mas não incluindo /# end aliases/ e finalmente p rint ou w rite changes e q uit.

    
por 14.09.2015 / 12:51