Mostrando postagens com marcador sed. Mostrar todas as postagens
Mostrando postagens com marcador sed. Mostrar todas as postagens

Linux: Escrevendo um wrapper para o ZSH

Pra começar, você sabe o que são Wrappers?

São programas que reescrevem funções de outros programas, funções que chamam um comando disponível no sistema mas que alteram determinados parâmetros para obter um resultado não usual.

Meu Exemplo: Tenho um script https://raw.githubusercontent.com/micheleb/subslider/master/subslider.py que tem o objetivo modificar legendas de filmes, mais especificamente o tempo das mesmas. O problema é que ao final o programa estava gerando caracteres estranos (código de final de linha do DOS) o famoso ^M. Isso era um incômodo pois gerava um trabalho extra de abrir o vim ou rodar o comando "sed -i 's/\x0D$//'" arquivo.

A solução: Um wrapper que você pode ver aqui:


Outro exemplo é um wrapper que achei para o comando ping, essa solução faz com que o ping aceite também http:// como parâmetro:
Neste link: http://www.cyberciti.biz/tips/unix-linux-bash-shell-script-wrapper-examples.html
A minha versão foi modificada para rodar no zsh
o código está aqui:


Talvez o mais famoso wrapper da atualidade seja o freshplayer que cria uma camada necessária para que o firefox possa usar o flashplugin mais atual do google-chrome.

Fica aí a dica pra galera.

Sed - ame-o ou deixe-o

separando o ultimo campo de um caminho

O problema

Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
 
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
 
preciso separar o que é o full path e o que é o arquivo. Tipo:
 
full=/dados/teste/uu/
arq=eu.sh
 
full=/dados/eu/
arq=eu.log
 
e por ai vai.

A solução

sed -i.backup -r  's,(.*/)(.*),full=\1 \narq=\2,'  arquivo
use '-i' para alterar diretamente o arquivo com o sed, com 
-i.backup ele gera um backup antes
 
 
troquei o delimitador para não confundir com as barras 
veja  sed -
 
r ............. expressões regulares extendidas
(.*/) ......... grupo 1 tudo até a ultima barra
(.*) .......... grupo 2 nome do arquivo
\1 ............ coloca o grupo 1 no local indicado
\2 ............ coloca o grupo 2 no local indicado
\n ............ note o \n antes de 'arq='

Bash: melhorando a complementação de comandos


sudo su -
# bash completion
linha=`awk '/enable bash completion/ {print NR}' /etc/bash.bashrc`
sed -i.backup "$((linha+1)),$((linha+3))s/^#//g" /etc/bash.bashrc

# uma vez configurado você pode por exemplo ver as opções do find assim
find -[tab][tab]

sudo apt-get install -y bash-completion-lib
sudo apt-get install -y python-optcomplete

# complementos para django: http://djangoadvent.com/1.2/improved-bash-completion/
# baixe este arquivo
# e insira também no ~/bashrc
if [[ -f ~/bin/django_bash_completion ]]; then
. ~/bin/django_bash_completion
fi

Esta informação também foi compartilhada aqui: http://ur1.ca/0zsee
Um artigo sobre complementação do Django.
Artigo do Eustáquio Rangel sobre a complementação de comandos do git

Artigo em ingles sobre completion http://aplawrence.com/Unix/customtab.html
other http://www.oreillynet.com/linux/blog/2007/02/improving_bash.html
more here.

Video do Linux Journal


Um script para incrementar as coisas, desse cara.

Amado Sed

Como adicionar de forma rápida um novo usuário aos mesmos grupos de outro?
No meu computador fiz assim:

sed -i.backup 's/sergio$/gabriel,&/g' /etc/group

O 'E' comercial "&" corresponde ao padrão da busca, o o cifrão corresponde ao final da linha.

Sed - Formatando campos de datas

Perguntinha postada no grupo sed-br no yahoo:

Pessoal,
Tenho um arquivo com formato de data que esta da seguinte maneira

2009-09-29
20090813
20070715
2008-09-15

e quero que ele tenha os hifens "-" onde nao tem, pra sair com a seguinte
formataçao:

2009-09-29
2009-08-13
2007-07-15
2008-09-15


Agradeço desde ja,
Moroni Vieira


My solution:

sed -i.backup -r 's/(^[0-9]{4})-?([0-9]{2})-?([0-9]{2})$/\1-\2-\3/g' file

Os díditos são agrupados entre parênteses para poder-mos usar os retrovisores, ou back reference \1 \2 \3, já os hifens são opcionais por conta da
interrogação. OBS: Para não ter que usar um monte de escapes "\" use a opção '-r' do
sed.

Synaptic - como exibir na listagem pacotes de terceiros

Aproveito a dica de como adicionar o repositório mediabuntu


A dica para fazer com que os pacotes de terceiros apareça no synaptic é rodar este
comando "como visto acima": sudo update-apt-xapian-index

Se desejar postar códigos de forma rápida use o pastebin: http://pastebin.com/
tem até uma extensão para o firefox muito legal aqui.

Eu amo regex

Meu amigo Renato me trouxe uma perguntinha intrigante ontem à noite. Como pegar:
protocolo, servidor e linguagem de três urls assim:

http://www.uol.com.br/index.php
http://www.oi.com.br/recados.asp
https://google/services.pl

trata-las e gerar esta saída:
protocolo: http server: uol linguagem: php
protocolo: http server: oi linguagem: asp
protocolo: https server: google linguagem: pl




Pra finalizar um site pra você testar suas expressões regulares:
http://gskinner.com/RegExr/

SED - substituição na linha seguinte a um padrão


# print the line immediately after a regexp, but not the line
# containing the regexp
# sed -n '/regexp/{n;p;}'

sed -i.backup '/pattern/{n;s/foo/bar/g}' file

# se o objetivo for deletar a linha após um padrão faça
sed -i.backup '/patter/{n;d;}' file

# já se a inteção for apenas imprimir a linha subsequente a um padrão
sed -n '/src admin/{n;p;}' teste.txt


Mais uma dica do SED: Para usar uma chave como argumento de um intervalo coloque-a
dentro de barras


# imprime de 'inicio' até a primeira ocorrência de '}'
sed -n '/inicio/,/}/p' file


Referências: http://sed.sourceforge.net/sed1line.txt

txt2html.sed by Thobias Salazar Trevisan

Achei muito legal e resolvi compartilhar com vocês, um script sed que converte arquivos txt em páginas html. http://thobias.org/bin/txt2html.sed.html

Não deixe de olhar o link bin do mesmo autor:
http://thobias.org/bin/

Como aprender linux de verdade?

De forma bem sincera eu lhes digo que aprender linux é um processo contínuo, diria que se você tem este desejo faça-se um grande favor, inscreva-se nas listas sed-br e shell script do yahoo, acompanhando problemas reais você vai aprender de verdade.

Veja por exemplo a solução para este problema:
http://br.groups.yahoo.com/group/sed-br/message/4338

Adicionando repositórios universe e multiverse em uma linha

Já havia tentado outras formas de descomentar as linhas universe e multiverse usando o sed, só que agora percebi uma coisa as linhas do cdrom também começam com # deb

sed -i.backup '/^#\s\?deb\( http\| ftp\|-src\)/s/^#//g' /etc/apt/sources.list

-i.backup ....... cria um backup do arquivo original
/^# ............. começo de linha comentário
\s\? ............ seguido ou não de espaço
deb ............. seguido da palavra deb
\( http\| ftp\|-src\) ... seguido de espaço http ou espaço ftp ou traço src
/s .............. substitua
^# .............. comentário no começo de linha
// .............. por nada
g .............. globalmente

Editando o resolv.conf por tabela

Se você editar o resolv.conf direto já sabe, ou deveria saber que é mesmo que nada :)
Então edita um arquivo que o NetworkManager lê e assim já configura o opendns de uma vez

cp /etc/dhcp3/dhclient.conf{,.backup}
sed -i '/^# *prepend/s/^#//g; s/127.*/208.67.220.220, 208.67.222.222;/g' /etc/dhcp3/dhclient.conf

O arquivo /etc/dhcp3/dhclient.conf é que deve ser editado para que o NetworManager pegue o dns que você deseja:

# apague "domain-name-servers," 
request subnet-mask, broadcast-address, time-offset, routers,
domain-name, domain-name-servers, host-name,
netbios-name-servers, netbios-scope;

sed -i '/
domain-name, domain-name-servers, host-name,/s/domain-name-servers,//g' /etc/dhcp3/dhclient.conf

Adicione a linha com o dns que você quer:
prepend domain-name-servers 208.67.222.222,208.67.220.220;

Referências:

Adicionando um novo usuário aos mesmos grupos de outro

Veja um trecho do /etc/group


dialout:x:20:sergio,olduser
fax:x:21:olduser
voice:x:22:
cdrom:x:24:sergio,olduser
floppy:x:25:olduser
tape:x:26:olduser
sudo:x:27:
audio:x:29:pulse,olduser
dip:x:30:olduser
www-data:x:33:
backup:x:34:
operator:x:37:
list:x:38:
irc:x:39:
src:x:40:
gnats:x:41:
shadow:x:42:
utmp:x:43:
video:x:44:olduser
sasl:x:45:
plugdev:x:46:sergio,olduser


sed -i 's/olduser$/olduser,newuser/g' /etc/group

Estamos pegando "olduser" no final de linha "$" e substituindo por "olduser,newuser"

Obs: Considere "olduser" um usuário que está contido em diversos grupos e que seu nome esteja no final da linha dos referidos grupos.

oneliner fix /etc/hosts


cp /etc/hosts{,.backup}
[[ -z $(head -1 /etc/hosts | grep "$(hostname)") ]] && sed -i "1s/\(.*\)/\1 `hostname`/g" /etc/hosts



Acabei editando o comando para fazer do jeito certo

O poder do SED

Nesta pequena lição sobre o amado comando SED vamos usar como base
uma dica passada pelo Andre Noel sobre como consertar os atalhos do mouse
e do terminal.

Dica 1: O sed pode editar direto o arquivo com o parâmetro '-i'

sed -i

Dica 2: O sed pode executar uma ação mediante uma condição

sed -i '/^casa/ s/grande/pequena/g' arquivo.txt

No comando acima a condição é que a linha comece com a palavra 'casa'
e a substituição (que é nossa ação) manda substituir uma coisa totalmente
diversa de casa, mas 'casa' foi a condição sacou?

Tomando como base estas duas dicas + a dica do Andre Noel experimentemos
o comando que segue:

sed -i '/^X-Ubuntu-Gettext-Domain=gnome-terminal/ s/^/#/g' \
/usr/share/applications/gnome-terminal.desktop

Ao invés de casa o padrão
/^X-Ubuntu-Gettext-Domain=gnome-terminal/
Ao invés de 'grande' indicamos a substituição de um começo de linha '^'
por um comentário no arquivo /usr/share/applications/gnome-terminal.desktop

Agora só falta o mouse que segue a mesma lógica.

sed -i '/^X-Ubuntu-Gettext-Domain=gnome-control-center-2.0/ s/^/#/g' \
/usr/share/applications/gnome-settings-mouse.desktop

Um brinde:

# Parando os consoles de 3 a 6 e o control-alt-delete
sed -i '6,7s/^start/stop/g' /etc/event.d/tty[3-6]
sed -i '/shutdown/ s/^/#/g' /etc/event.d/control-alt-delete


#Resolvendo problema do navegador offline do firefox
# referência http://andregondim.eti.br/?p=574
# fonte: http://andregondim.eti.br/?p=555

sed -i.backup ‘/^allow send_interface=”org.freedesktop.NetworkManager/ s/allow/deny/g’ \
/etc/dbus-1/system.d/NetworkManager.conf

# resolvendo problema no aptitude

wget http://launchpadlibrarian.net/19491146/aptitude-defaults.pt_BR -O /usr/share/aptitude/aptitude-defaults.pt_BR



Gostaria de deixar aqui um agradecimento especial ao Aurélio Marinho Jargas
que através de seus manuais de Expressões Regulares e do próprio SED me deram
a condição de lhes passar agora esta dica.

Quase esquecia de mandar o link do SED How To feito pelo Aurélio:
http://aurelio.net/sed/sed-HOWTO/index.html

linux-cookbook

Grupos do Google
Participe do grupo linux-cookbook
E-mail:
Visitar este grupo