Portanto, tenho vários arquivos em um diretório e preciso inserir uma linha de texto em cada um deles. Eles têm essencialmente o seguinte formato:
<VirtualHost *:80>
ServerAdmin gabe@localhost
DocumentRoot /var/www/test1
ServerName test1.local
ServerAlias test1
<Directory "/var/www/test1">
Options All
AllowOverride All
</Directory>
</VirtualHost>
E eu gostaria de inserir uma linha antes do fechamento
</VirtualHost>tag. Minha primeira suposição é que eu deveria ser capaz de fazer isso com o sed, provavelmente combinando e substituindo essa tag. Vou começar a tentar isso agora, mas se alguém já tiver uma maneira de fazer isso, eu adoraria ouvir.
text-processing
sed
Gabe.
fonte
fonte
Respostas:
Algo assim:
trabalho. Se você deseja repetir este comando em muitos arquivos, pode fazer algo como:
Provavelmente melhor (mas não testado) graças a @ChrisDown:
fonte
/
para a expressão sed é mais limpa, desde que você não tem que escapar do golpe:'s:</VirtualHost>:yourlinehere\n</VirtualHost>:'
Se você não se importa com o Perl, tente:
A
-i
opção salvará seu arquivo antigo com uma.old
extensão e será impresso no atual.fonte
Você também pode usar "ex" (linha de comando vi) se a edição que você deseja fazer for um pouco complicada. Por exemplo, você deseja fazer a inserção apenas em uma instância de "".
Um script de shell como este pode funcionar:
Essa abordagem oferece as vantagens de "ex": encontrar um local com padrões elaboarte e 'movimentos do cursor'. Você pode fazer coisas como encontrar um padrão e, em seguida, encontrar a próxima instância, ENTÃO faça a inserção. Ou você pode alterar o texto, em vez de apenas fazer inserções. Ou você pode mudar entre os intervalos. Não esqueça que "ex" permite que você use "." como a linha atual, portanto, / ^ somepatter / s / blah / foo / funcionará.
fonte
Você pode usar o seguinte código de linha única para inserir uma única linha ou várias linhas em um determinado local em um arquivo, no seu caso antes de 'VirtualHost'. O código basicamente procura o nome do arquivo (pode ser *. *, Se você quiser inserir os textos em todos os arquivos) dentro do diretório especificado e de seus subdiretórios. Nos arquivos encontrados, ele procura o padrão 'VirtualHost'. Depois de encontrar o padrão, ele o substitui por firstline \ nsecondline \ notherlines \ n \ VirtualHost. Observe que 'VirtualHost' faz parte do texto para substituição, caso contrário, o perderemos.
fonte