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 [email protected]
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>
Algo assim:
sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'
trabalho. Se quiser repetir este comando em vários arquivos, você pode fazer algo como:
for i in *; do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' "$i"; done
Provavelmente melhor (mas não testado) graças a @ChrisDown:
find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\
done
Se você não se importa com o Perl, tente:
Perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile
O -i
switch salvará seu arquivo antigo com um .old
extensão e imprime para o atual.
Você também pode usar "ex" (linha de comando vi) se a edição que deseja fazer for ainda um pouco complicada. Por exemplo, você só deseja inserir para em uma instância de "".
for FILENAME in *.whatever # Need a criteria to glob, or a list of names
do
ex -s $FILENAME << END_EDITS
/^<\/VirtualHost>/
O " capital-o, not zero
text to insert goes here
.
w!
q
END_EDITS
done
Esta 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, então 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 se esqueça de que "ex" permite que você use "." como a linha atual, então.,/^ somepatter/s/blah/foo/funcionará.
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 procura basicamente o nome do arquivo (pode ser *. *, Se você quiser inserir os textos em todos os arquivos) dentro do diretório fornecido e seus subdiretórios. Dentro dos 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, iremos perdê-lo.
find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'