Linux comando sed fácil

Linux comando sed fácil

---

Comando Sed no Linux com exemplos - o comando sed é um editor de fluxo e pode executar muitas funções em arquivos como, pesquisar, localizar e substituir, inserção ou exclusão. Embora o uso mais comum do comando sed seja para substituição ou para localizar e substituir. Usando o sed, você pode editar arquivos mesmo sem abri-lo, o que é uma maneira muito mais rápida de encontrar e substituir algo no arquivo, do que primeiro abrindo esse arquivo num editor de texto, por exemplo o vim e depois alterando-o.

---

O sed é um poderoso editor de fluxo de texto. Pode fazer inserção, exclusão, pesquisa e substituição. O comando sed suporta expressão regular, o que permite executar uma correspondência complexa de padrões.

---

Sintaxe:

sed OPÇÕES... [SCRIPT] [ARQUIVO DE ENTRADA...]

---

Verifique a versão do sed:

sed --version

---

Substituição básica de texto:

echo "Linguagem Bash Script" | sed 's/Bash/Perl/'

---

Resultado é algo parecido com isto:

~:$ echo "Linguagem Bash Script" | sed 's/Bash/Perl/'
Linguagem Perl Script
~:$

---

Comando:

echo 'Domingo' | sed 's/Domingo/Domingo é feriado/'

---

Resultado é algo parecido com isto:

~:$ echo 'Domingo' | sed 's/Domingo/Domingo é feriado/'
Domingo é feriado

---

Comando:

echo 'Segunda' | sed 's/Segunda/Segunda é dia comercial/'

---

Resultado é algo parecido com isto:

~:$ echo 'Segunda' | sed 's/Segunda/Segunda é dia comercial/'
Segunda é dia comercial

---

Executo:

echo 'Terça' | sed 's/Terça/Terça não é feriado/'

---

Resultado é algo parecido com isto:

~:$ echo 'Terça' | sed 's/Terça/Terça não é feriado/'
Terça não é feriado

---

Executo:

echo 'linux é um clone do unix mas é linux' | sed 's/unix/linux/'

echo 'linux é um clone do unix mas linux não é unix' | sed 's/unix/linux/'

---

Resultado:

~:$ echo 'linux é um clone do unix mas é linux' | sed 's/unix/linux/'
linux é um clone do linux mas é linux

~:$ echo 'linux é um clone do unix mas linux não é unix' | sed 's/unix/linux/'
linux é um clone do linux mas linux não é unix

---

Lembro que: por padrão, o comando sed substitui somente a primeira ocorrência do padrão em cada linha e não substitui a segunda, terceira ... ocorrência na linha.

---

E em um arquivo de texto em um diretório?

---

Crio um diretório para testes. Dentro deste diretório, crio um arquivo de texto .txt chamado de 'texto-teste-sed.txt' com o seguinte:

O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qualquer unix ou linux você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.
Segunda
Terça
Quarta
Quinta
Sexta
Sábado
Domingo

---

Dá para fazer isto pelo terminal:

cd

mkdir TESTES

cd TESTES

touch texto-teste-sed.txt

echo -e 'O unix é ótimo. \nO unix é de código aberto. \nunix é sistema operacional livre. \naprenda sistema operacional. \nunix linux qualquer unix ou linux você pode escolher. \nO unix é fácil de aprender. \no unix é um sistema operacional multiusuário. \nAprenda unix. \nO unix é uma ferramenta poderosa. \nOs sistemas Linux OS são ótimos. \nAproveite os sistemas Linux OS. \nSegunda \nTerça \nQuarta \nQuinta \nSexta \nSábado \nDomingo' > texto-teste-sed.txt

---

Como remover o espaço em branco do final das linhas?

Use um espaço em branco simples * ou [: blank:] * para remover todos os espaços possíveis no final da linha:

sed 's/ *$//' texto-teste-sed.txt

sed 's/[[:blank:]]*$//' texto-teste-sed.txt

---

Acontece muito:

Eu queria encontrar o texto chamado "foo" e substituído por "bar" no arquivo chamado "hosts.txt". Como uso o comando sed para localizar e substituir em sistemas Linux? O sed significa editor de stream. Ele lê o arquivo fornecido, modificando a entrada conforme especificado por uma lista de comandos sed. Por padrão, a entrada é gravada na tela, mas você pode forçar a atualização do arquivo.

O procedimento para alterar o texto em arquivos no Linux usando sed? Use o Stream EDitor (sed) da seguinte maneira:

sed -i 's/texto-antigo/novo-texto/g' texto-teste-sed.txt

O s é o comando substituto do sed para encontrar e substituir.
Ele diz ao sed para encontrar todas as ocorrências de 'texto antigo' e substituí-lo por 'novo texto' em um arquivo chamado input.txt.
Verifique se o arquivo foi atualizado:

more input.txt

---

Exemplo:

sed -i 's/Domingo/Bolhas/g' texto-teste-sed.txt

cat texto-teste-sed.txt

more texto-teste-sed.txt

---

Para deixar parecido com o que era antes:

sed -i 's/Bolhas/Domindo/g' texto-teste-sed.txt

cat texto-teste-sed.txt

more texto-teste-sed.txt

---

A sintaxe para encontrar e substituir textos usando sed?

sed 's/palavra1/palavra2/g' input.file

---

Como usar o sed para corresponder à palavra e executar encontrar e substituir? Neste exemplo, encontre apenas a palavra 'amor' e substitua-a por 'doente' se o conteúdo da linha for uma sequência específica, como FOO:

touch input.txt

echo -e "Amar é amor amor \nAmor é amar amor \nAmar é FOO amor amor" > input.txt

more input.txt

sed -i -e '/FOO/s/amor/doente/' input.txt

Para verificar as mudanças:

cat input.txt

---

Resultado:

~/bin:$ touch input.txt
~/bin:$ echo -e "Amar é amor amor \nAmor é amar amor \nAmar é FOO amor amor" > input.txt
~/bin:$ more input.txt
Amar é amor amor
Amor é amar amor
Amar é FOO amor amor
~/bin:$ sed -i -e '/FOO/s/amor/doente/' input.txt
~/bin:$ cat input.txt
Amar é amor amor
Amor é amar amor
Amar é FOO doente amor
~/bin:$

---

Substituindo ou sobrescrevendo uma string: o comando Sed é usado principalmente para substituir o texto em um arquivo. O comando sed simples abaixo substitui a palavra "unix" por "linux" no arquivo.

sed 's/unix/linux/' texto-teste-sed.txt

---

Aqui o "s" especifica a operação de substituição. Os "/" são delimitadores. O "unix" é o padrão de pesquisa e o "linux" é a string de substituição. Por padrão, como lembrei, o comando sed substitui a primeira ocorrência do padrão em cada linha e não substitui a segunda, terceira ... ocorrência na linha.

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qualquer unix ou linux você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo a nésima ocorrência de um padrão em uma linha: Use os sinalizadores /1, /2 etc para substituir a primeira e a segunda ocorrência de um padrão em uma linha. O comando abaixo substitui a segunda ocorrência da palavra "unix" por "linux" em uma linha.

sed 's/unix/linux/2' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/2' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo toda a ocorrência do padrão em uma linha: O sinalizador substituto /g (substituição global) especifica o comando sed para substituir todas as ocorrências da sequência na linha.

sed 's/unix/linux/g' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/g' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Substituindo da nésima ocorrência para todas as ocorrências em uma linha: Use a combinação de /1, /2 etc e /g para substituir todos os padrões da enésima ocorrência de um padrão em uma linha. O comando sed a seguir substitui a terceira, quarta, quinta ... palavra "unix" pela palavra "linux" em uma linha.

sed 's/unix/linux/3g' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/3g' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Parênteses no primeiro caractere de cada palavra: Este exemplo sed imprime o primeiro caractere de cada palavra entre parênteses.

echo "Bem Vindo Ao Semanickz Blog!" | sed 's/\(\b[A-Z]\)/\(\1\)/g'

---

Resultado é algo parecido com isto:

TESTES:$ echo "Bem Vindo Ao Semanickz Blog!" | sed 's/\(\b[A-Z]\)/\(\1\)/g'
(B)em (V)indo (A)o (S)emanickz (B)log!
TESTES:$

---

Substituindo a sequência em um número de linha específico: Você pode restringir o comando sed para substituir a sequência em um número de linha específico. Um exemplo é:

sed '3 s/unix/linux/' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '3 s/unix/linux/' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Duplicar a linha substituída com o sinalizador / p: O sinalizador de impressão / p imprime a linha substituída duas vezes no terminal. Se uma linha não possui o padrão de pesquisa e não é substituída, o / p imprime essa linha apenas uma vez.

sed 's/unix/linux/p' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed 's/unix/linux/p' texto-teste-sed.txt
O linux é ótimo.
O linux é ótimo.
O linux é de código aberto.
O linux é de código aberto.
linux é sistema operacional livre.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
o linux é um sistema operacional multiusuário.
Aprenda linux.
Aprenda linux.
O linux é uma ferramenta poderosa.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
TESTES:$

---

Imprimindo apenas as linhas substituídas: Use a opção -n junto com o sinalizador de impressão / p para exibir apenas as linhas substituídas. Aqui, a opção -n suprime as linhas duplicadas geradas pelo sinalizador / p e imprime as linhas substituídas apenas uma vez.

sed -n 's/unix/linux/p' texto-teste-sed.txt

OBS:
Se você usar -n sozinho sem /p, o sed não imprimirá nada.

---

Resultado é algo parecido com isto:

TESTES:$ sed -n 's/unix/linux/p' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
TESTES:$

---

Substituindo a sequência em um intervalo de linhas: Você pode especificar um intervalo de números de linhas no comando sed para substituir uma sequência.

sed '1,3 s/unix/linux/' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '1,3 s/unix/linux/' texto-teste-sed.txt
O linux é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
unix linux qual um você pode escolher.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Aqui, o comando sed substitui as linhas com intervalo de 1 a 3.

sed '2,$ s/unix/linux/' texto-teste-sed.txt

OBS:
Aqui $ indica a última linha do arquivo. Portanto, o comando sed substitui o texto da segunda linha para a última linha no arquivo.

---

TESTES:$ sed '2,$ s/unix/linux/' texto-teste-sed.txt
O unix é ótimo.
O linux é de código aberto.
linux é sistema operacional livre.
aprenda sistema operacional.
linux linux qual um você pode escolher.
O linux é fácil de aprender.
o linux é um sistema operacional multiusuário.
Aprenda linux.
O linux é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Excluindo linhas de um arquivo específico: o comando SED também pode ser usado para excluir linhas de um arquivo específico. O comando SED é usado para executar a operação de exclusão sem abrir o arquivo. Exemplo:

sed '5d' texto-teste-sed.txt

---

Resultado é algo parecido com isto:

TESTES:$ sed '5d' texto-teste-sed.txt
O unix é ótimo.
O unix é de código aberto.
unix é sistema operacional livre.
aprenda sistema operacional.
O unix é fácil de aprender.
o unix é um sistema operacional multiusuário.
Aprenda unix.
O unix é uma ferramenta poderosa.
Os sistemas Linux OS são ótimos.
Aproveite os sistemas Linux OS.TESTES:$

---

Para deletar a última linha:

sed '$d' texto-teste-sed.txt

---

Para excluir uma linha do intervalo x até y

sed '3,6d' texto-teste-sed.txt

---

Para excluir da enésima até a última linha

sed '12,$d' texto-teste-sed.txt

---

Para excluir a linha correspondente de padrão

sed '/abc/d' texto-teste-sed.txt

---

É interessante de ler a man page do sed. Praticar alterando estes exemplos em outros arquivos de texto que criar.

---

Linux expressões regulares REGEX fácil

O jeito fácil de aprender REGEX

Aprendendo expressões regulares.

A melhor maneira de aprender expressões regulares é experimentar os exemplos e modificá-los um pouco para testar sua compreensão. É comum cometer erros em seus padrões enquanto você está aprendendo. Quando isso acontece, normalmente todas as linhas serão correspondidas ou nenhuma linha será correspondida ou algum conjunto obscuro. Não se preocupe se isso acontecer, você não causou nenhum dano e pode facilmente voltar e tentar outra vez. Lembre-se de que você pode pressionar a seta para cima no teclado para obter seus comandos recentes e também modificá-los para que você não precise digitar novamente o comando todo o tempo.

Se você não está obtendo o resultado desejado, aqui estão algumas estratégias básicas.

Primeiro, verifique se há erros de digitação. Se você é como eu, então você está propenso a fazê-los. Leia novamente o conteúdo aqui. Talvez o que você pensou que um operador em particular fez tenha sido ligeiramente diferente do que realmente faz e, ao ler, você notará um ponto que pode ter perdido na primeira vez. Divida seu padrão em componentes individuais e teste cada um deles individualmente. Isso ajudará você a ter uma idéia de quais partes do padrão estão corretas e quais partes você precisa ajustar.

VISÃO GERAL DA EXPRESSÃO REGULAR

. (ponto) – um único caractere.

? – o caractere anterior corresponde apenas a 0 ou 1 vezes.

* – o caractere anterior corresponde a 0 ou mais vezes.

+ – o caractere anterior corresponde 1 ou mais vezes.

{n} – o caractere anterior corresponde exatamente n vezes.

{n, m} – o caractere anterior corresponde pelo menos n vezes e não mais que m vezes.

[agd] – o caractere é um daqueles incluídos entre colchetes.

[^ agd] – o caractere não é um daqueles incluídos entre colchetes.

[c-f] – o traço entre colchetes funciona como um intervalo. Nesse caso, significa as letras c, d, e ou f.

() – permite agrupar vários caracteres para se comportar como um.

| (símbolo do tubo/pipe) – a operação lógica OR.

^ – corresponde ao início da linha.

$ – corresponde ao final da linha.

Crio uma TESTES e dentro dela um texto-teste.txt. O texto-teste.txt vai conter:

Lago seco 4
Rua Berta 7
Ana Mabra 7
Greg Sila 3
# Bom Dia!
# Boa Tarde!
# Boa Noite!
# Usuário Linux
1- Ele usa Linux
2- Ela usa Linux
3- Nós usamos Linux
1 – Vita:1508:TESTE1:Novo1
2 – Vita:1509:TESTE2:Novo2
3 – Vita:1509:TESTE3:Novo3
Vitas:1518:TESTE1:Novo:1
Vitas:1529:TESTE2:Novo:2
Vitas:1539:TESTE3:Novo:3
Plutão Marte Saturno
Pera Uva Maçã Banana
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

Comece com algo simples. Digamos que desejamos identificar qualquer linha com duas ou mais vogais seguidas. No exemplo abaixo, o multiplicador {2,} se aplica ao item anterior, que é o intervalo.

egrep ‘[aeiou]{2,}’ texto-teste.txt

grep -E ‘[aeiou]{2,}’ texto-teste.txt

Resultado:

TESTES:$ grep -E ‘[aeiou]{2,}’ texto-teste.txt
Rua Berta 7
# Bom Dia!
# Boa Tarde!
# Boa Noite!
# Usuário Linux
TESTES:$

egrep ‘2.+’ texto-teste.txt

grep -E ‘2.+’ texto-teste.txt

Resultado:

TESTES:$ egrep ‘2.+’ texto-teste.txt
2- Ela usa Linux
2 – Vita:1509:TESTE2:Novo2
Vitas:1529:TESTE2:Novo:2

egrep ‘2$’ texto-teste.txt

grep -E ‘2$’ texto-teste.txt

Resultado:
ff
TESTES:$ grep -E ‘2$’ texto-teste.txt
2 – Vita:1509:TESTE2:Novo2
Vitas:1529:TESTE2:Novo:2
TESTES:$

egrep ‘na|ia|no’ texto-teste.txt

grep -E ‘na|ia|no’ texto-teste.txt

Resultados:

TESTES:$ egrep ‘na|ia|no’ texto-teste.txt
Ana Mabra 7
# Bom Dia!
Plutão Marte Saturno
Pera Uva Maçã Banana

TESTES:$ grep -E ‘na|ia|no’ texto-teste.txt
Ana Mabra 7
# Bom Dia!
Plutão Marte Saturno
Pera Uva Maçã Banana
TESTES:$

egrep ‘^[A-K]’ texto-teste.txt

grep -E ‘^[A-K]’ texto-teste.txt

Resultado:

TESTES:$ grep -E ‘^[A-K]’ texto-teste.txt
Ana Mabra 7
Greg Sila 3
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

TESTES:$ egrep ‘^[A-K]’ texto-teste.txt
Ana Mabra 7
Greg Sila 3
Bala Bela Bila Bola Bula
Fala Fela Fila Fola Fula

Agora é criar um arquivo similar e ir brincando reformulando os exemplos.

Dar uma lida na man page do grep e do egrep e usar o que leu.

Praticar sempre que puder diariamente por uma ou duas semanas.

Tenha sempre ao seu lado a VISÃO GERAL DA EXPRESSÃO REGULAR

Assim é que aprende. Praticando todos os dias, em 15 dias (no máximo) provavelmente, já vai saber o suficiente para brincar com o REGEX usando os comandos sed e awk.