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?
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)...
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]