ti-enxame.com

Adicionar uma linha de texto a vários arquivos

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>
10
gabe.

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
10
lcipriani

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.

2
gvkv

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 "".

Um script Shell como este pode funcionar:

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á.

2
Bruce Ediger

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'
0
Oufie