Adicionando uma linha de texto a vários arquivos

8

Então, eu tenho um monte de arquivos em um diretório, e eu 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>

Eu gostaria de inserir uma linha antes do fechamento

</VirtualHost>
tag. Minha primeira suposição é que eu deveria ser capaz de fazer isso com sed, provavelmente correspondendo e substituindo essa tag. Eu vou começar a tentar isso agora, mas se alguém tiver uma maneira existente de fazer isso, eu adoraria ouvir isso.     
por gabe. 24.08.2010 / 21:15

4 respostas

9

Algo parecido com isto:

sed 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/'

funciona. Se você quiser repetir este comando em muitos 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 ao @ChrisDown:

find . -type f -print0 | while IFS= read -r -d '' filename;\
do sed -i 's/<\/VirtualHost>/yourlinehere\n<\/VirtualHost>/' $filename;\ 
done
    
por 24.08.2010 / 21:23
2

Se você não se importar com o Perl, tente:

perl -pi'*.old' -e 's(</VirtualHost>(Your stuff here\n</VirtualHost>)' myfile

A opção -i salvará seu arquivo antigo com uma extensão .old e imprimirá no atual.

    
por 24.08.2010 / 21:29
2

Você também pode usar "ex" (vi da linha de comando) se a edição que você deseja fazer for um pouco complicada. Por exemplo, você só deseja inserir a inserção em uma instância de "".

Um script de shell como esse 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

Essa abordagem oferece as vantagens de "ex": encontrar um local com padrões de elaboarte e "movimentos de 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 intervalos. Não se esqueça que "ex" permite usar "." como a linha atual, então, / ^ somepatter / s / blah / foo / irá funcionar.

    
por 24.08.2010 / 21:35
0

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 do '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 e seus subdiretórios. Nos arquivos encontrados, ele procura pelo padrão 'VirtualHost'. Depois de encontrar o padrão, ele o substituirá por \ nsecondline \ notherlines \ n \ VirtualHost de primeira linha. Note que 'VirtualHost' é parte do texto para substituição, caso contrário, perderemos isso.

find directory/ -name filename -print | xargs sed -i 's|VirtualHost|firstline\nsecondline\notherlines\nVirtualHost|g'
    
por 28.06.2013 / 12:38