+ Responder ao Tópico



  1. #1

    Padrão Script para incluir textos no meio de arquivos

    Ola,

    Sabe-se que para incluir no final, basta usar >>, e para incluir no inicio, basta criar um arquivo temporario, jogar a info do inicio, depois fazer um cat >> do arquivo original, e por fim renomear o temporario para o original.

    Agora eu ainda nao consegui visualizar como fazer um algoritmo para inserir uma string no meio de um arquivo. Supondo que ao encontrar uma string "XXX" no meio do arquivo, e que eu precise colocar algumas linhas de texto nas linhas abaixo do "XXX", como eu poderia fazer? Sera que tem algum comando do Shell Script que estou esquecendo de usar?

  2. #2

    Padrão Script para incluir textos no meio de arquivos

    Colega.. eu tb preciso de algo assim... mas como n tenho mto tempo ainda n estudei o assunto a fundo.. apenas sei que isso é possivel de fazer com o "sed" (stream editor)...

  3. #3

    Padrão Script para incluir textos no meio de arquivos

    Código :
    sed 's/o que voce quer encontrar/o que voce quer colocar no lugar/' 
    arquivo

    Suponhamos que temos um arquivo "log.txt". E neste arquivo quero substituir a sequencia (que estiver em qualquer linha):

    Código :
    "nome:" + alguns espacos, ou nenhum espaco + nome do sujeito + ";"

    por

    Código :
    "nome" + 1 espaco + "=" + 1 espaco + nome do sujeito

    por ex:

    Código :
    "nome:        joao;"
    "nome:pedro;"
    "nome: maria;"

    querendo o resultado assim:
    Código :
    "nome = joao"
    "nome = pedro"
    "nome = maria"

    A regexp ficaria assim:

    Código :
    sed 's/nome\:\s*\(.*\)\;/nome\s\=\s\1/' log.txt

    tentando explicar pra facilitar um pouco:

    . = qualquer caractere
    + = um ou mais
    * = nenhum ou mais
    \s = caractere de espaco
    \; = caractere de ponto-e-virgula
    \= = caractere de igual
    \: = caractere de dois-pontos

    logo, .* = nenhum ou mais caracteres (qualquer caractere)
    logo .+ = um ou mais caracteres (qualquer caractere)
    logo \s* = nenhum ou mais espacos
    logo \;+ = um ou mais ponto-e-virgula

    continuando... neste comando temos, em ordem:

    s = comando dado para substituir algo
    / = inicializador da expressao que iremos procurar
    nome = texto "nome"
    \s* = nenhum espaco ou mais
    \(.*\) = guarda nenhum ou qualquer caractere (se houver) dentro de um
    identificador.. neste caso o identificador será \1 pois é o primeiro identificador (unico na verdade).. se eu tivesse mais identificadores, por exemplo para a frase "REGEXP MATADOR", com a regexp s/(.*/)\s(.*/)/\1\;\2/, eu teria o valor "REGEXP" no identificador \1 e o valor "MATADOR" no identificador \2. E assim por diante, conforme usar mais identificadores, o valor poderá ser recuperado pelo número correspondente, o primeiro será \1, o segundo será \2, e segue...
    \; = caractere de ponto-e-virgula
    / = terminador da expressao que iremos procurar, e inicializador da expressao que iremos usar pra substituir.
    nome = texto "nome"
    \s = caractere de espaco
    \= = caractere de igual
    \s = caractere de espaco
    \1 = primeiro identificador, que corresponde ao valor que guardamos com os parenteses la na expressao que procuramos.
    / = finalizador da expressao que iremos usar pra substituir

    Não sei se consegui esclarecer a idéia dos identificadores.
    Também não sei se a explicação foi em vão.
    Espero que tenha ajudado alguém, principalmente o autor do tópico.

    Qualquer coisa, poste(m) aí.[/code]