http://www.zago.eti.br/sed.txt FAQ com mensagens da lista Linux-br Use CTRL+F para refinar a pesquisa. veja também: Exemplos de linha de comando, scripts com sed Indicações de tutoriais e documentação http://www.zago.eti.br/script/sed.html Outras ferramentas semelhantes e mais FAQ sobre scripts Página principal sobre script em geral (FAQ) http://www.zago.eti.br/script/A-menu-scripts.html ********************************************************* Converter arquivos texto do dos -> unix ou unix -> dos O final de linha em arquivos DOS aparece no Linux com ^M, exemplo como um arquivo for DOS é visto no Linux com final de linha ^M$: cat -A autoexec.bat mode con codepage prepare=((850) C:\WINDOWS\COMMAND\ega.cpi)^M$ mode con codepage select=850^M$ keyb br,,C:\WINDOWS\COMMAND\keyboard.sys^M$ Com sed pra converter o texto pra Linux, execute: sed 's/^M//g' autoexec.bat > unix.txt OBS. não funcionou copiar e colar a linha acima, até fiz a copia mas antes de dar enter, precisou apagar o ^M e digitar ^V^M, explicando, o ^M é a representação gráfica de CTRL+v+m, nesta conversão o sed precisa do codigo das teclas, não tentei substituir no comando o ^M pelo codigo das teclas, nem sei se funciona, a solução adotada foi a troca antes de dar enter, remover o ^M e posicionar o cursor no local, mantenha pressionada a tecla CTRL e pressione as teclas "v" e "m" que aparece o ^M, assim converte o arquivo, ver o resultado: cat -A unix.txt mode con codepage prepare=((850) C:\WINDOWS\COMMAND\ega.cpi)$ mode con codepage select=850$ keyb br,,C:\WINDOWS\COMMAND\keyboard.sys$ Converter arquivo unix para DOS, use este formato: sed 's/$/^M/g' unix.txt > arqdos.txt Lembre de apagar o ^M e digitar em seu lugar CTRL+v+m. Enquanto não descubro qual a solução que funciona com copiar e colar, vai valendo a dica de substituir o ^M pela digitação do CTRL+v+m. Explicando: No Linux o final de linha é um LF ("line-feed"), no DOS o final de linha são dois caracteres, o CR e LF (CR = carriage return, lf = line feed) codigo ASCII 13 e 10. ********************************************************* find /diretorio -name *.pf -exec basename {} \; | sed s/"\.pf"//g Isso devolve só o nome dos arquivos e retira a extensão. man basename ********************************************************* execute : cat /etc/passwd | grep /bin/bash | sed 's/bin/dev/'| sed 's/bash/null/' > /etc/passwd On 9 xxx -1 corez@mailbr.com.br wrote: Olá lista, gostaria de saber do pessoal que entende de sed... tenho um arquivo passwd com o shell dos usuários apontando para /bin/bash, gostaria de trocar todo mundo para /dev/null, ********************************************************* > Olá lista, gostaria de saber do pessoal que > entende de sed... > tenho um arquivo passwd com o shell dos > usuários apontando para /bin/bash, > gostaria de trocar todo mundo para /dev/null, > mas são 4000 usuários... sei que usando o sed > dar para fazer isso, mas eu já estou há dois dias tentando e > nada... alguém da lista poderia me dizer ou me ajudar aonde > acho documentação a respeito ? supondo que os usuários sejam todos do grupo 100 (você não quer trocar até o shell do root, quer? ';P) cat /etc/passwd | sed '/[0-9]:100/s%/bin/bash%/dev/null%' > passwd.new /[0-9]:100/ procure por: número de 0-9, dois pontos e 100 s%/bin/bash troque /bin/bash %/dev/null por /dev/null % só ou, se for difícil saber qual os grupos, utilize um parâmetro de linhas, como substituir da décima linha até o final: sed '10,$ s%/bin/bash%/dev/null%' sed you later, -- ********************************************************* De: Marcus Lima Responder-a: Marcus Lima Para: Thiago Macieira , linux-br@bazar.conectiva.com.br Assunto: Re: (linux-br) desafio BASH: como fazer substituição de uma string contida numa variavel usando sed Data: 17 Jan 2003 19:50:13 -0200 > > O sed não edita arquivos. Oi Thiago, só uma correção sed significa Stream Editor, e com o Editor no nome esperasse que ele edite arquivos. Os comandos do sed são parecidos com o do vim e não é por acaso, a diferença é que no vim você precisa acessar o arquivo para alterar e o sed faz isso em linha de comando... Sendo assim: sed "s/string1/string2/g" < arquivo > arquivo2 Funciona e é bem mais simples que Perl. Gudiluqui, - Marcus Lima. ********************************************************* SED - Apagando a primeira linha de um arquivo --------------------------------------------------------------------- O comando sed (Stream Editor) pode ser utilizado para realizar diversas operacoes em arquivos texto. Diferentemente de um editor de textos normal, a operacao realizada nao e gravada diretamente no arquivo mas enviada para o "standard output" ou STDOUT. Tomemos por exemplo o arquivo chamado teste que contem as seguintes linhas: 1 2 3 4 5 Se executarmos o comando sed 1d teste aparecera na tela o seguinte conteudo: 2 3 4 5 Caso queiramos salvar o resultado desta operacao devemos redirecionar a saida para um arquivo: sed 1d teste > teste.out ***************************************************** SED - Mais alguns comandos uteis --------------------------------------------------------------------- O Arnaldo Mandel, da USP, me enviou ontem um lembrete muito importante: --------------------------------------------------------------------- Nunca redirecione a saida para o proprio arquivo. Por exemplo, sed 1d teste > teste apagaria o conteudo do arquivo teste. Para usar o sed na edicao de um arquivo, e preciso gravar um temporario e depois jogar em cima do original: sed 1d teste > teste.out && mv teste.out teste --------------------------------------------------------------------- Eu tambem cometi um erro chamando o SED de "String Editor". O nome correto e "Stream Editor". Gostaria de agradecer ao Arnaldo por suas correcoes e sugestoes. A mensagem de hoje tambem aborda o SED: --------------------------------------------------------------------- Tomando ainda como exemplo o arquivo da mensagem de ontem, se quisermos inserir um espaco em branco nas linhas 3 e 4 basta executar o comando: sed "3,4s/^/ /" teste e obtemos o resultado 1 2 3 4 5 Se quisermos substituir os caracteres nas linhas 1 e 2 pela letra x: sed "1,2s/^./x/" teste temos entao x x 3 4 5 Podemos tambem inserir um caracter nesta mesma posicao: sed "1,2s/^/x/" teste x1 x2 3 4 5 Para inserir na ultima posicao de cada linha o caracter % basta executar o comando: sed "s/$/%/" teste 1% 2% 3% 4% 5% Nao esquecer nunca que para salvar o resultado do trabalho devemos fazer o redirecionamento para um arquivo. ********************************************************* SED - Execucao de Multiplos Comandos --------------------------------------------------------------------- Voce pode executar diversas acoes, a partir de uma unica invocacao do comando sed. Tomando novamente o arquivo teste como exemplo, cujo conteudo e 1 2 3 4 5 e executando o comando sed abaixo sed -e "s/^/<>/" teste temos <<1>> <<2>> <<3>> <<4>> <<5>> ********************************************************* Impressao de Linhas de Arquivo com sed --------------------------------------------------------------------- O comando sed me permite imprimir uma determinada linha de um arquivo. O comando: sed -n -e 10p teste ira imprimir a decima linha do arquivo chamado teste. A diretiva "-n" impede que o conteudo do arquivo seja exibido ao mesmo tempo. Apenas a linha selecionada sera exibida. Isto pode ser usado em um programa onde o numero da linha assume o valor de uma variavel permitindo que eu trabalhe com valores diferentes a cada momento. ********************************************************* SED - Caracteres delimitadores --------------------------------------------------------------------- Colaboracao: Lilliam Palermo Todo comando sed basicamente consiste na procura de determinados caracteres e na acao sobre os caracteres encontrados ou algum outro caracter que esteja na linha em questao. Quando queremos fazer substituicao do caracter "/" a coisa fica mais complicada, pois este e justamente o caracter utilizado para delimitar os argumentos fornecidos ao sed. O que poucos sabem e que os caracteres delimitadores podem ser substituidos. Se quisermos substituir em um arquivo a string /usr/local/bin por /bin, teriamos que fazer algo do tipo: sed 's/\/usr/\local\/bin/\/bin/' teste > teste.out o que e bastante complicado. Podemos fazer tambem da seguinte forma: sed 's|/usr/local/bin|/bin|' teste > teste.out A "/" foi substituida pelo caracter "|" e ficou muito mais facil digitar o comando. Esta mesma facilidade pode ser usada no editor "vi", conforme ja abordado na mensagem http://www.unicamp.br/dicas-l/dicas-l/970320.html ********************************************************* Justificador de texto com Sed --------------------------------------------------------------------- Colaboração: Aurélio Marinho Jargas [aurelio@conectiva.com.br] Este script com sed para justificar texto é um verdadeiro achado. Foi escrito pelo Aurélio Marinho, que inclusive mantém uma lista de discussão sobre sed, onde já aprendi muita coisa boa e interessante. Ressaltando, a mensagem do Aurélio eu peguei da lista, da qual sou assinante. Pedi autorização a ele para publicar na Dicas-L e para nossa sorte ele concordou :) Para assinar a lista sed-br, basta enviar uma mensagem vazia para o endereço sed-br-subscribe@eGroups.com. A seguir, a mensagem do Aurélio, já formatada com o script justifica.sed: --------------------------------------------------------------------- olás, sexta à noite, hoje não rolou show ou náite, então a ociosidade me fez ser produtivo &:) aí nessa falta de algo de melhor pra fazer, fiz um carinha que fazia tempo que eu queria, um justificador de texto. não é perfeito, mas funciona. pega um texto já quebrado no número limite de colunas e apenas inclui uns espaços em branco aqui e ali, da esquerda para a direita, palavra por palavra, até atingir o limite máximo de colunas (no caso 65, que é o que eu uso aqui no pine). se quiser usá-lo, basta: prompt$ chmod +x justifica.sed prompt$ ./justifica.sed arquivo.txt > arquivo-justificado.txt se quiser alterar, o número de colunas máximo, troque todos os 65 do script pelo número desejado. se quiser usar no vim, selecione o texto com o modo visual e :'<,'>!justifica.sed ah! esta mensagem foi justificada por ele &:) justifica.sed #!/bin/sed -f # justify.sed # # it gets a text already wrapped on the desired number of columns # and add extra white spaces, from left to right, word by word, # to justify all the lines. there is a maximum of 5 spaces to be # inserted between the words. if this limit is reached, the line # is not justified (come on, more than 5 is horrible). empty # lines are ignored. btw, this comments were justified with this # script &:) # # 20000715 <aurelio@conectiva.com.br> # we'll only justify lines with less than 65 chars /^.\{65\}/!{ # cleaning extra spaces of the line s/^ \+// s/ \+/ /g s/ \+$// # don't try to justify blank lines /^$/b # backup of the line h # spaces -> pattern # convert series of spaces to a internal pattern `n :s2p s/ /`5/g s/ /`4/g s/ /`3/g s/ /`2/g s/ /`1/g t 1space b # pattern -> spaces # restore the spaces converted to the internal pattern `n :p2s s/`5/ /g s/`4/ /g s/`3/ /g s/`2/ /g s/`1/ /g t check b # check if we've reached our right limit # if not, continue adding spaces :check /^.\{65\}/!b s2p b # here's the "magic": # add 1 space to the first and minor internal pattern found. # this way, the extra spaces are always added from left to right, # always balanced, one by one. # right after the substitution, we'll restore the spaces and # test if our limit was reached. :1space s/`1/`2/ ; t p2s s/`2/`3/ ; t p2s s/`3/`4/ ; t p2s s/`4/`5/ ; t p2s # we don't want to justify with more than 5 added spaces between # words, so let's restore the original line /`5/x } --------------------------------------------------------------- As mensagens da lista Dicas-L são veiculadas diariamente para 8896 assinantes. Para sair ou assinar a lista Dicas-L, consulte o documento que se encontra em http://www.Dicas-l.com.br/FAQ.html. A redistribuição desta e outras mensagens da lista Dicas-L pode ser feita livremente, deste que o conteúdo, inclusive esta nota, não sejam modificados. --------------------------------------------------------------- ********************************************************* corez@linuxbr.com.br, @ 26/??/?? - : ^^^^^^^^^^^^^^^^^ teu programa de mail tá informando as datas em português, o que vai contra os padrões. > Olá lista ! > Estou c/ um problemão... > tenho um arquivo c/ os logins dos users > nome1 > nome2 > nome3 > > Só que preciso desse arquivo da seguinte maneira: > nome1,nome2,nome3 > todos separados por vírgula... > Tentei usar o sed (sei que ele é bom para isso).. > poutz.... estou apanhando tem 3 dias... > Alguém pode me ajudar ! > Eliphas, você que é o mestre no sed... help-me ! UAAAALA... essa é fácil, aprendiz... $ cat arquivo nome1 nome2 nome3 nome4 nome5 $ sed ':a;$bb;N;ba;:b;s/\n/,/g' tst nome1,nome2,nome3,nome4,nome5 $ tá, já exercitei o ego. agora vou explicar ':) :a marca a $bb se a linha for a última, pule pra marca b (branch b) N junta a linha com a próxima ba pule pra marca a :b marca b s/\n/,/g troca os \n por vírgula, em toda a última (e única) linha sed you later, ********************************************************* > > tenho um arquivo c/ os logins dos users > > nome1 > > nome2 > > nome3 > > > > Só que preciso desse arquivo da seguinte maneira: > > nome1,nome2,nome3 > > todos separados por vírgula... > > Tentei usar o sed (sei que ele é bom para isso).. > > poutz.... estou apanhando tem 3 dias... > > Alguém pode me ajudar ! > > Eliphas, você que é o mestre no sed... help-me ! Que tal algo mais simples que o sed... tr '\n' ',' < arquivo_sem_virgula > novo_arquivo_com_virgulas []'s até funciona, mas ele vai colocar a vírgula no final também, é só editar o arquivo e remover a última vírgula. ********************************************************* > Estou c/ um problemão... > tenho um arquivo c/ os logins dos users > nome1 > nome2 > nome3 > > Só que preciso desse arquivo da seguinte maneira: > nome1,nome2,nome3 > todos separados por vírgula... > Tentei usar o sed (sei que ele é bom para isso).. > poutz.... estou apanhando tem 3 dias... > Alguém pode me ajudar ! > Eliphas, você que é o mestre no sed... help-me ! Serve o ed? :) Funciona do mesmo jeito, mas você não tem de mandar pra um arq. temporário e depois mover de volta: ed bla 1,$s/$/,/ # Poe vírgula no fim de toda linha, menos a última 1,$j # Junta todas as linhas w q ********************************************************* -------------------------------------------------------------------- DESCADASTRAMENTO: mailto:Dicas-L-Request@unicamp.br?body=unsubscribe -------------------------------------------------------------------- http://www.dicas-l.com.br/dicas-l/20011002.shtml SED: Remoção de espaços em branco no final das linhas --------------------------------------------------------------------- Colaboração: Marcelo Pereira Todo mundo já teve que formatar um texto, quebras linhas, juntar parágrafos, e, ao final, percebe que existem espaços brancos nos finais das linhas. Para remover os espaços, utilizando 'sed', façamos o seguinte: % cat arquivo.in | sed 's/ *$//g' > arquivo.out Pronto ! Os espaços brancos no final das linhas foram embora. --------------------------------------------------------------- As mensagens da lista Dicas-L são veiculadas diariamente para 16796 assinantes. A redistribuição desta e outras mensagens da lista Dicas-L pode ser feita livremente, deste que o conteúdo, inclusive esta nota, não sejam modificados. --------------------------------------------------------------- _______________________________________________ Dicas-L mailing list Dicas-L@www.Dicas-l.com.br http://www.unicamp.br/mailman/listinfo/dicas-l ********************************************************* Subject: (linux-br) SOLUCAO = Re: (linux-br) SED - Tirando acentos ! Oies ! Achei duas solucoes para a minha pergunta: http://groups.yahoo.com/group/sed-br/message/619 http://www.dicas-l.com.br/dicas-l/19970426.shtml ********************************************************* De: Anderson Lizardo Gomes Para: Zé Luís , linux-br@bazar.conectiva.com.br Assunto: Re: (linux-br) shell - incluir e remover linha de arquivo Data: 15 Jul 2002 13:08:41 -0400 Em Seg, 15 Jul 2002 09:20:18 -0300, Zé Luís escreveu: > tem algum comando de shell que eu consiga fazer isso: > > "Essa eh minha linha" > > - incluir "Essa eh minha linha" no arquivo /tmp/meu_arquivo.txt > > - excluir "Essa eh minha linha" do arquivo /tmp/meu_arquivo.txt insere linhas: echo "Essa eh minha linha" >> /tmp/meu_arquivo.txt exclui linhas: sed -n '/^Essa eh minha linha$/!p' /tmp/meu_arquivo.txt Nota: a inserção de linhas tb pode ser feita com o sed, mas o echo é mais simples ;-) ********************************************************* De: Edgard Lemos Assunto: Re: (linux-br) Eliminar caracteres do texto - sed > To com o seguinte problema, quero RETIRAR os termos & do texto > abaixo e não estou conseguindo com o sed usando o comando s/&//g > > modload&name=News&file=article&sid=24 > > Alguem tem alguma dica? Em primeiro lugar, coloque o & entre aspas, porque o bash interpreta & e ; como caracteres especiais. Em segundo lugar, o sed retira o & do seu arquivo apenas para representação na tela. Ao listar o arquivo novamente, o & vai estar lá de novo. Então você precisa desviar a saída para outro arquivo. Você não deve desviar para o próprio arquivo, porque antes de gravar o resultado, ele zera seu conteúdo. Observe a seguinte experiência: $ cat > arquivo modload&name=News&file=article&sid=24 $ sed s/"&"//g arquivo modloadname=Newsfile=articlesid=24 Viu! Sumiu, mas: $ cat arquivo modload&name=News&file=article&sid=24 Voltou! Então, $ sed s/"&"//g arquivo > arquivo2 $ cat arquivo 2 modloadname=Newsfile=articlesid=24 Agora, sim. Depois é só renomear arquivo2 para arquivo e pronto. $ mv arquivo2 arquivo []s ********************************************************* De: dicas-l-owner@unicamp.br Assunto: [Dicas-L] Substituição com sed Endereço: http://www.Dicas-l.com.br/dicas-l/20021025.shtml Substituição com sed ==================== Recentemente precisei zerar o campo da senha do usuário root no arquivo /etc/shadow. A linha que eu precisava mudar tem o seguinte formato: root:$1$GpYaenSE$8mXEvGgDvJ.0KNk2uhlRr0:11901:0:99999:7::: Os campos são separados pelo caractere ":". Então: sed 's/^root:.*:/root::/' /etc/shadow e fiquei com root:: Ao que parece a coisa foi longe demais. Na expressão ^root:.*: o sed substituiu tudo até o último ":". Acontece que, no jargão das expressões regulares, o comando é "guloso". Ele saiu trocando tudo, inclusive o caractere ":" até achar o último ":" na linha, o que deu um resultado totalmente diverso do que eu esperava. O jeito foi fazer: sed 's/^root:[^:]*:/root::/' /etc/shadow Desta vez deu certo: root::11901:0:99999:7::: A expressão "[^:]" significa "case com qualquer caractere exceto o caractere ":"". Como o sed na verdade não faz a mudança no arquivo, eu preciso completar o comando: # cp /etc/shadow /tmp/shadow # sed 's/^root:[^:]*:/root::/' /tmp/shadow > /etc/shadow # rm /tmp/shadow A saída do comando é redirecionada, a partir do arquivo temporário. Ao final, movo o arquivo temporário para o lugar definitivo (/etc/shadow). Esta é apenas uma das muitas facilidades que o sed oferece. Para saber mais sobre expressões regulares o melhor caminho é ler o livro do Aurélio Marinho Jargas, "Expressões Regulares", publicado pela editora NOVATEC (http://novateceditora.com.br/guias/expreg/). ********************************************************* De: Bino Assunto: Re: (linux-br) Apagar determinada linha > Como faço para apagar determinada linha, isto é, tenho um arquivo com 1 > milhao de linhas ... (400MB) e quero excluir uma linha determinada .... > exemplo linha 12000, que esta errada .... o resultado eh claro vai para > outro arquivo. Use o sed: $ sed -e '1,10d' /etc/services > file_novo esse comando acima apaga as linhas de 1 a 10 do arquivo /etc/services e joga a sai pro arquivo filé_novo Mais infs em man sed e no google procure sed example ibm tem um tutorial legal com exemplos ... té mais :-) Vc tem o editor joe instalado? $joe nomedoarquivo (p/ abrir o arquivo) Qdo abrir o arquivo, tecle Ctrl+K+L (comando dentro do joe para ir a linha especifica), digita 12000 e ele ira para a linha especificado. Tecle Ctrl+Y na linha para apaga-la Tecle Ctrl+K+X para salvar e sair do arquivo []´s Claudio Cabral ********************************************************* De: Édson Flávio de Souza Assunto: Re: (linux-br) Comando SED faltou um complemento na resposta anterior. sed s/"\/ems2sims\.pf"//g NomedoArquivo > NovoArquivo o sed não substitui no mesmo arquivo por isso precisa redirecionar para outro arquivo, isso lógico, se você está pegando esta string em um arquivo. > Estou querendo usar o sed ou qualquer outro programa para tornar a > seguinte cadeia de string /fdis/bauru/ems2sims.pf > em /fdis/bauru, alguém poderia me ajudar???Estou viajando nisso. ********************************************************* De: Édson Flávio de Souza Assunto: Re: (linux-br) Comando SED sed s/"\/ems2sims\.pf"//g deve ter outras maneiras, mas esta pelo momento resolve. > Estou querendo usar o sed ou qualquer outro programa para tornar a > seguinte cadeia de string /fdis/bauru/ems2sims.pf > em /fdis/bauru, alguém poderia me ajudar???Estou viajando nisso. ********************************************************* De: Anderson Lizardo Responder-a: lizardo@users.sourceforge.net Para: Informatica , Linux-BR Assunto: Re: (linux-br) Auxilio com sed ( CORRECAO DA PERGUNTA ) Data: 06 Mar 2003 21:47:58 -0300 Informatica escreveu: > Obrigado pela ajuda mas o problema nao e trocar a expressao pois a > que > eu usei funciona, a questao e porque funciona campo sim, campo nao. > Andei pensando e acho que talvez seja porque o primeiro '#' do campo > > nao, tenha sido o ultimo '#' do campo sim, ou seja: > > # # # > |-----------| este e o campo sim > |-----------| este e o campo nao > Ah, agora ficou mais claro ;-) Tente esta expressão então: sed ':loop;s/# \+#/#\\N#/g;t loop' Não é muito diferente da expressão anterior. A diferença é que ele faz um loop no arquivo para ver se não passou "despercebido" por algum campo. Testei aqui e funciona para o caso citado. Note que, com esta expressão, uma linha como esta: # # # # Será interpretada como tendo 3 campos. A expressão que enviei em mensagem anterior (e a sua também) interpretava esta mesma linha como dois campos separados por espaço. Enfim, use a expressão que interprete o arquivo como esperado. ===== -- ********************************************************* De: Anderson Lizardo Para: linux Cc: linux-br@bazar2.conectiva.com.br Assunto: Re: (linux-br) grep, cut, sed .. sei la... :-) Data: 03 Jul 2003 21:11:19 -0300 Em Quarta, 02 de Julho de 2003 16:19, linux escreveu: > Tenho um arquivo com o formato + ou - assim.. > > 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,19,20,a,b,c,d,e,f,g,h,i,j,k >,l,m,n, > o,p,r,s,t,u,I,II,III,IV,V,VI,VII,VII,IX,X,XI,XII,XII,XIV,XV,XVI,XVII, >XVII,XI X,XX > > e por ai vai... ou seja... a cada 20 campos delimitados por "," eu > tenho um registro... mas nao tenho CR LF (0D0A) em nenhum momento pra > separar cada registro... Olá, Ufa! Passei um tempão quebrando cabeça em como fazer o sed funcionar para esta tarefa. Cheguei a pensar que tinha um bug no sed, ou algo do tipo. Depois notei que faltava um singelo "18" no arquivo exemplo, fazendo com que o primeiro registro tivesse 19 caracteres e o restante dos registros ficassem bagunçados. Aí vai o comando: sed 's/\([^,]*,\)\{20\}/&\n/g' arquivo.txt | sed 's/,$//g' \ > arquivo_novo.txt O segundo sed serve apenas para remover as vírgulas do final de cada linha. As newlines criadas serão "LF" (padrão no Unix). O esforço valeu como desafio ;-) mais informações: man sed; info sed -- Anderson Lizardo ********************************************************* De:  Anderson Lizardo Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)Script para modificar linha Data:  Wed, 5 May 2004 16:49:13 -0400 On Wednesday 05 May 2004 12:44, Diniz Alexandre Daminelli wrote: > Como fazer para trocar o primeiro caracter, de uma linha, de um arquivo > texto. > > Gostaria de trocar o simbolo # por um espaço em branco, e o contrario > também, um espaço em branco para o simbolo #; mas só em determinada linha. > [...] > A modificação seria feita somente no primeiro caracter, e em uma > determinada linha, que seria encontrada pelo identificador da linha > superior a ela. Sei que com o comando sed dá para realizar tal taerefa so > nao sei como. Para comentar: sed -i 's/^/#/' arquivo Para descomentar: sed -i 's/^#//' arquivo Onde "" é a linha que se deseja (des)comentar. Ex: sed -i '2s/^/#/' arquivo Note que você precisa saber o número exato da linha. Descobrir esta informação a partir do número da sala é complicado, pois estes números não correspodem ao número da linha seguinte. Uma outra solução seria: sed -i "$(( * 2))s/^/#/" arquivo e sed -i "$(( * 2))s/^#//" arquivo Onde é o número da sala (sem o zero da frente, senão o número será interpretado como octal). Note, entretanto, que para esta solução funcionar, o arquivo precisa ter _exatamente_ este formato: #sala XX #sala YY ... Ou seja, sem linhas em branco adicionais. -- Anderson Lizardo De:  Anderson Lizardo Para:  linux-br@bazar2.conectiva.com.br, Diniz Alexandre Daminelli Assunto:  Re: (linux-br)Sed - script Data:  Thu, 6 May 2004 21:51:34 -0400 On Thursday 06 May 2004 13:11, Diniz Alexandre Daminelli wrote: > O que eu gostaria na verdade é trocar o primeiro caracter, de uma linha, de > um arquivo texto via linha de comando. > [...] > Já consigo localizar a linha que desejo com o comando: > > comando >>> sed -n '/SALA - 02/{n;p;}' firewall > saida do comando >>>  #/sbin/iptables -t nat -A PREROUTING -s x.x.x.x/24 -d > 0.0.0.0/0 -p > > o que eu gostaria de fazer agora era adicionar ou retirar o simbolo "#" > inicial da linha e salvar o aquivo. OK, vou tentar de novo (talvez você não tenha recebido meu e-mail): Comentar (inserir o #): sed -i '/SALA 02/{n;s/^/#/;}' arquivo Descomentar (remover o #): sed -i '/SALA 02/{n;s/^#//;}' arquivo -- Anderson Lizardo ********************************************************* De:  Anderson Lizardo Para:  linux-br@bazar2.conectiva.com.br Assunto:  Re: (linux-br)script para remover linhas Data:  Thu, 20 May 2004 20:34:47 -0400 On Tuesday 18 May 2004 15:36, Carlos Eduardo wrote: > pessoal, tenho um arquivo com 1000 linhas por ex... > e preciso excluir todas que comecam com 0003 > tem mais ou menos umas 100 linhas que iniciam com 0003 > sem estar em sequencia.. ( uma embaixo da outra.. ) > teria como ter um script que fizesse essa remoção pra mim > direto... pois 1 vez por semana terei que fazer isso ... Só complementando as dicas dos colegas: Você pode usar o sed para editar o arquivo diretamente: sed -i '/^0003/d' arquivo.txt -- Anderson Lizardo ********************************************************* De:  Dicas-L-Owner@unicamp.br Assunto:  [Dicas-L] Dicas de SED Data:  Sat, 29 May 2004 03:04:15 -0300 -------------------------------------------------------------------- Comente esta dica em http://www.Dicas-l.com.br/dicas-l/20040529.php -------------------------------------------------------------------- O Jeito Certo http://www.idph.net/artigos/novaeducacao/jeitocerto.php --------------------------------------------------------------------   Dicas de SED   ============ 1. Para substituir em um arquivo, todas as ocorrências da palavra banana por laranja, com exceção da palavras encontradas na linha 10, fazemos assim:     --- sed '10!s/banana/laranja/g' 2. Para inserir uma linha em branco entre as linhas de um arquivo:   sed 'G' arquivo.txt > /tmp/arquivo.txt && mv /tmp/arquivo.txt . 3. Para inserir três linhas:   sed 'G;G' arquivo.txt > /tmp/arquivo.txt && mv /tmp/arquivo.txt . -----------------------------------------------------------   Ciclo de palestras gratuitas na Universidade Anhembi Morumbi   ============================================================ Em Junho, serão ministradas 4 palestras gratuitas e beneficientes na disciplina de "Novas Tecnologias" do curso "Criação e Desenvolvimento de Web Sites" da Universidade Anhembi Morumbi, organizadas pela Profa Martha Carrer Cruz Gabriel, a saber: - "Software Livre", por Cesar Braga - 1/junho, 3a feira, 20:00h - "Web Services", por Douglas Camargo Leal - 3/junho, 5a feira, 20:00h - "Java", por Fabio Velloso - 8/junho, 3a feira, 20:00h - "VoiceXML", por Cristian Gallegos e Renato Pereira - 15/junho, 20:00h As palestras focam a conceituação das tecnologias envolvidas, suas importâncias e como usar, através de exemplos e análises. Os interessados em comparecer deverão trazer um quilo (ou mais) de alimento não perecível.  Os itens arrecadados serão doados para instituições de caridade atendidas pela universidade. Para se inscrever, basta mandar um email para  martha@nmd.com.br com o título da palestra no campo de assunto e com as seguintes informações no corpo do email - Nome, Endereço, Telefone e email. Serão fornecidos certificados aos participantes de cada palestra. As vagas são limitadas, e serão preenchidas em ordem de inscrição.   Local das palestras:  Universidade Anhembi Morumbi, Campus Centro, São Paulo, SP.                         Rua Dr. Almeida Lima, 1134 - sala 534 - 5o andar                         Horário:  20:00h   -------------------------------------------------------------------- As mensagens da lista Dicas-L são veiculadas diariamente para 24919 assinantes.        Todas as mensagens da Dicas-L ficam armazenadas em                http://www.Dicas-l.com.br. A redistribuição desta e outras mensagens da lista Dicas-L pode ser feita livremente, deste que o conteúdo, inclusive esta nota, não sejam modificados. --------------------------------------------------------------- ********************************************************* De:  Dicas-L-Owner@unicamp.br Assunto:  [Dicas-L] sed: alterações sem arquivos temporários Data:  Tue, 02 Nov 2004 02:53:28 -0300 Desenvolvendo Websites com PHP 4 http://novateceditora.com.br/livros/php4/ --------------------------------------------------------------------   sed: alterações sem arquivos temporários   ======================================== Colaboração: Rodrigo Bernarndo Pimentel O modo mais comum de se utilizar o sed, quando se desejam fazer alterações em um arquivo, é jogar as alterações em um arquivo temporário, depois mover este para o arquivo original:   sed 's/foo/bar/g' arquivo > arquivo.tmp && mv arquivo.tmp arquivo Esta forma é inclusive usada com freqüência nas mensagens veiculadas na dicas-l. No entanto, desde a versão 3.95 (pelo que pude verificar), existe a opção "--in-place" (ou "-i"), que permite a edição direta do arquivo:   sed -i 's/foo/bar/g' arquivo Pode-se também especificar um sufixo para o "-i", de forma que o arquivo original seja copiado para o nome original, acrescentado do sufixo, antes de ser alterado, criando, na prática, um arquivo de backup:   sed -i.bak 's/foo/bar/g' arquivo Isto altera "arquivo" (todas as ocorrências de "foo" são substituídas por "bar"), criando "arquivo.bak" com o conteúdo original de "arquivo" (antes da substituição). Notas: O sufixo deve estar junto ao "-i", não pode ser separado por espaços, como normalmente é permitido em argumentos de linha de comando. Se for utilizado o formato longo, o formato é "--in-place=sufixo". -------------------------------------------------------------------- Colabore com a Dicas-L. Publique seu comentário sobre esta mensagem em http://www.Dicas-l.com.br/dicas-l/20041102.php -------------------------------------------------------------------- As mensagens da lista Dicas-L são veiculadas diariamente para 25805 assinantes.        Todas as mensagens da Dicas-L ficam armazenadas em                http://www.Dicas-l.com.br/dicas-l/ A redistribuição desta e outras mensagens da lista Dicas-L pode ser feita livremente, desde que o conteúdo, inclusive esta nota, não sejam modificados. -------------------------------------------------------------------- ********************************************************* *********************************************************