O comando sed é um editor poderoso de fluxo de textos, utilizado para filtrá-los e transformá-los.
O comando trabalha tanto a partir de fluxos provenientes de um pipe ou a partir de arquivos. Ao finalizar cada linha em que trabalha, o comando passa para a seguinte (até o final do texto). Sua saída-padrão (STDOUT) é a tela do terminal (mas também consegue trabalhar com redirecionamentos).
Esse conteúdo faz parte do nosso curso “Comandos GNU Linux e Unix ” que é parte integrante da trilha preparatória para a certificação Linux LPI 101.
Principais opções:
–e, –expression: Adiciona uma expressão aos comandos a serem executados.
-f, –file: Adiciona conteúdos presentes em um arquivo a serem aplicados ao comando.
-i, –in-place: Realiza as alterações diretamente no arquivo.
-r, –regexp-extended: Utiliza expressões regulares estendidas.
Vamos iniciar os estudos aplicando o comando em cenários onde a necessidade seja para substituir dados. Aplicando o comando ao fluxo oriundo da entrada-padrão (stdin), ou seja, do teclado:
dltec@cap3:~$ echo “Estou estudando o comando sed” | sed ‘s/estudando/devorando/’
Estou devorando o comando sed
Perceba que o subcomando s substitui o primeiro termo (estudando) pelo segundo (devorando).
Agora, vamos ver a atuação do comando sobre arquivos. Veja a seguir:
Criação do arquivo ListaCarros
dltec@cap3:~$ cat > ListaCarros
PeugeotPeugeot Peugeot
RenaultPeugeot Peugeot
Ford
Chevrolet
Toyota
Fiat
Audi
Suponhamos que precisássemos substituir somente a primeira ocorrência de cada linha que contenha a palavra “Peugeot” por “Honda”.
dltec@cap3:~$ sed ‘s/Peugeot/Honda/’ ListaCarros
HondaPeugeot Peugeot
RenaultHonda Peugeot
Ford
Chevrolet
Toyota
Fiat
Audi
Note que o arquivo original não é alterado – o resultado é somente exibido na STDOUT. Para que ele seja alterado, é necessário utilizar a opção -i ou os redirecionadores de fluxos de texto.
Se o objetivo for alterar todas as palavras Peugeot do texto, poderíamos utilizar a flag ‘g’:
dltec@cap3:~$ sed ‘s/Peugeot/Honda/g’ ListaCarros
HondaHonda Honda
RenaultHonda Honda
Ford
Chevrolet
Toyota
Fiat
Audi
Também é possível informar ao sed para que este realize mais de uma tarefa. Imagine o seguinte cenário:
1 – Alterar somente a primeira ocorrência de cada linha que contenha o termo Audi por Ford.
2 –Substituir todas as ocorrências do termo Peugeot (que estejam situadas entre a primeira e a terceira linha do arquivo) por HondaII.
dltec@cap3:~$ sed -e ‘s/Audi/Honda/1; 1,3 s/Peugeot/HondaII/g’ ListaCarros
HondaIIHondaII HondaII
RenaultHondaII HondaII
Ford
Chevrolet
Toyota
Fiat
Honda
Também podemos especificar ao comando sed para que este trabalhe com dados a partir das instruções contidas em um arquivo:
Criação dos arquivos de instruções
dltec@cap3:~$ cat > arquivoDeComandos
s/Peugeot/peugeot/
s/Renault/renault/
dltec@cap3:~$ sed -f arquivoDeComandos ListaCarros
peugeotPeugeot Peugeot
renaultpeugeot Peugeot
Ford
Chevrolet
Toyota
Fiat
Audi
Observe outros exemplos:
Altera somente a segunda ocorrência do termo Peugeot por Honda
dltec@cap3:~$ sed ‘s/Peugeot/Honda/2’ ListaCarros
PeugeotHonda Peugeot
RenaultPeugeot Honda
Ford
Chevrolet
Toyota
Fiat
Audi
Substitui somente a primeira ocorrência da palavra “Peugeot” por “peugeot”
(em cada linha), utilizando a flag p – redirecionando a saída através do pipe
para o comando nl, de forma que este enumere as linhas
dltec@cap3:~$ sed ‘s/Peugeot/peugeot/p’ ListaCarros | nl
1 peugeotPeugeot Peugeot
2 peugeotPeugeot Peugeot
3 Renaultpeugeot Peugeot
4 Renaultpeugeot Peugeot
5 Ford
6 Chevrolet
7 Toyota
8 Fiat
9 Audi
Note que, ao utilizarmos a flag “p”, o comando sed aplica as alterações na linha em que encontrar correspondência e, em seguida, as imprime novamente. Ou seja, aquelas linhas onde as substituições foram efetuadas são exibidas de forma duplicada. Para alterar esse comportamento, podemos utilizar a opção -n:
dltec@cap3:~$ sed -n ‘s/Peugeot/peugeot/p’ ListaCarros | nl
1 peugeotPeugeot Peugeot
2 Renaultpeugeot Peugeot
Agora, vamos substituir todas as ocorrências do termo “Peugeot” por “Honda”, desde que estejam situadas entre a primeira e a terceira linha (mas utilizando o pipe para redirecionar a saída do comando cat ao comando sed):
dltec@cap3:~$ cat ListaCarros | sed ‘1,3 s/Peugeot/Honda/g’
HondaHonda Honda
RenaultHonda Honda
Ford
Chevrolet
Toyota
Fiat
Audi
A última linha poderá ser manipulada através do caractere “$”. Dessa forma, vamos a seguir substituir todas as ocorrências do termo “Peugeot” por “Volkswage”, situadas entre a segunda e a última linha:
dltec@cap3:~$ sed ‘2,$ s/Honda/Volkswagen/g’ ListaCarros
PeugeotPeugeot Peugeot
RenaultVolkswagen Volkswagen
Ford
Chevrolet
Toyota
Fiat
Audi
Troca a palavra Ford por Cord, utilizando a flag y
dltec@cap3:~$ sed ‘y/Ford/Cord/’ ListaCarros
Peugeot Peugeot Peugeot
Renault Peugeot Peugeot
Cord
Chevrolet
Toyota
Ciat
Audi
Agora, vamos enviar ao arquivo “ListaCarrosAlterado” todo o conteúdo do arquivo “ListaCarros” – exceto a primeira e a segunda linha (usando a flag “d”):
dltec@cap3:~$ sed ‘1,2 d’ ListaCarros > ListaCarrosAlterado
dltec@cap3:~$cat ListaCarrosAlterado
Ford
Chevrolet
Toyota
Fiat
Audi
No próximo exemplo, vamos remover a linha que inicia (^) com o texto “Ford” e, em seguida, vamos redirecionar o conteúdo restante do arquivo ao “ListaCarrosAlterado”:
dltec@cap3:~$ sed ‘/^Ford/d’ ListaCarros > ListaCarrosAlterado
dltec@cap3:~$ cat ListaCarrosAlterado
PeugeotPeugeot Peugeot
RenaultPeugeot Peugeot
Chevrolet
Toyota
Fiat
Audi
Outro flag muito utilizado é o “q”. Ao ser aplicado, este permite ao comando parar a sua execução após encontrar o padrão especificado. Por exemplo, podemos utilizá-lo para ler as primeiras 15 linhas do arquivo /etc/passwd:
dltec@cap3:~$ sed “15q” /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/bin/sh
man:x:6:12:man:/var/cache/man:/bin/sh
lp:x:7:7:lp:/var/spool/lpd:/bin/sh
mail:x:8:8:mail:/var/mail:/bin/sh
news:x:9:9:news:/var/spool/news:/bin/sh
uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh
proxy:x:13:13:proxy:/bin:/bin/sh
www-data:x:33:33:www-data:/var/www:/bin/sh
backup:x:34:34:backup:/var/backups:/bin/sh
list:x:38:38:Mailing List Manager:/var/list:/bin/sh
O comando sed é bastante rico em possibilidades. Abra o manual e visualize as demais possibilidades. Voltaremos a ele ainda neste capítulo, quando estudarmos sobre as expressões regulares.
Lembrando que isso é apenas uma parte do conteúdo do curso “Comandos GNU Linux e Unix“. Caso você tenha interesse em se especializar em Linux não deixe de conhecer o conteúdo completo em nosso portal.