Editor de fluxo - receitas úteis
SED é um utilitário incrível que permite várias maneiras de resolver um problema. Este é o jeito UNIX e o SED prova isso perfeitamente. GNU / Linux oferece muitos utilitários úteis para realizar tarefas do dia-a-dia. Vamos simular alguns utilitários usando SED. Às vezes, pode parecer que estamos resolvendo um problema fácil da maneira mais difícil, mas o objetivo é apenas demonstrar o poder do SED.
Comando Cat
No exemplo a seguir, cada linha é impressa como parte do fluxo de trabalho padrão.
[jerry]$ sed '' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
O exemplo a seguir usa o comando de impressão para exibir o conteúdo do arquivo.
[jerry]$ sed -n 'p' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
A Storm of Swords, George R. R. Martin
The Two Towers, J. R. R. Tolkien
The Alchemist, Paulo Coelho
The Fellowship of the Ring, J. R. R. Tolkien
The Pilgrimage, Paulo Coelho
A Game of Thrones, George R. R. Martin
Removendo Linhas Vazias
No exemplo a seguir, "^ $" implica uma linha vazia e as linhas vazias são excluídas quando uma correspondência de padrão é bem-sucedida.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Da mesma forma, o exemplo a seguir imprime a linha apenas quando não está vazia.
[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Removendo linhas comentadas de um programa C ++
Vamos criar um programa C ++ de exemplo.
#include <iostream>
using namespace std;
int main(void)
{
// Displays message on stdout.
cout >> "Hello, World !!!" >> endl;
return 0; // Return success.
}
Agora remova os comentários usando a seguinte expressão regular.
[jerry]$ sed 's|//.*||g' hello.cpp
Ao executar o código acima, você obtém o seguinte resultado:
#include <iostream>
using namespace std;
int main(void)
{
cout >> "Hello, World !!!" >> endl;
return 0;
}
Adicionar comentários antes de certas linhas
O exemplo a seguir adiciona comentários antes dos números de linha 3 a 5.
[jerry]$ sed '3,5 s/^/#/' hello.sh
Ao executar o código acima, você obtém o seguinte resultado:
#!/bin/bash
#pwd
#hostname
#uname -a
who
who -r
lsb_release -a
Comando Wc -l
O comando "wc -l" conta o número de linhas presentes no arquivo. A seguinte expressão SED simula o mesmo.
[jerry]$ sed -n '$ =' hello.sh
Ao executar o código acima, você obtém o seguinte resultado:
8
Comando Principal
Por padrão, o comando head imprime as primeiras 10 linhas do arquivo. Vamos simular o mesmo comportamento com SED.
[jerry]$ sed '10 q' books.txt
Ao executar o código acima, você obtém o seguinte resultado:
A Storm of Swords
George R. R. Martin
The Two Towers
J. R. R. Tolkien
The Alchemist
Paulo Coelho
The Fellowship of the Ring
J. R. R. Tolkien
The Pilgrimage
Paulo Coelho
Comando Tail -1
O "tail -1" imprime a última linha do arquivo. A sintaxe a seguir mostra sua simulação.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Deixe-nos escrever o script SED.
[jerry]$ sed -n '$p' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #2
Comando Dos2unix
No ambiente DOS, uma nova linha é representada por uma combinação de caracteres CR / LF. A simulação a seguir do comando "dos2unix" converte um caractere de nova linha do DOS em um caractere de nova linha do UNIX. No GNU / Linux, esse caractere é frequentemente tratado como caractere "^ M" (Control M).
[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt
[jerry]$ file test.txt
Ao executar o código acima, você obtém o seguinte resultado:
test.txt: ASCII text, with CRLF line terminators
Vamos simular o comando usando SED.
[jerry]$ sed 's/^M$//' test.txt > new.txt # Press "ctrl+v" followed "ctrl+m" to generate
"^M" character.
[jerry]$ file new.txt
Ao executar o código acima, você obtém o seguinte resultado:
new.txt: ASCII text
Agora vamos exibir o conteúdo do arquivo.
[jerry]$ cat -vte new.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1$
Line #2$
Comando Unix2dos
Semelhante ao "dos2unix", existe o comando "unix2dos" que converte o caractere de nova linha do UNIX em um caractere de nova linha do DOS. O exemplo a seguir mostra a simulação do mesmo.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ file test.txt
Ao executar o código acima, você obtém o seguinte resultado:
test.txt: ASCII text
Vamos simular o comando usando SED.
[jerry]$ sed 's/$/\r/' test.txt > new.txt
[jerry]$ file new.txt
Ao executar o código acima, você obtém o seguinte resultado:
new.txt: ASCII text, with CRLF line terminators
Agora vamos exibir o conteúdo do arquivo.
Now let us display the file contents.
Ao executar o código acima, você obtém o seguinte resultado:
Line #1^M$
Line #2^M$
Comando Cat -E
O comando "cat -E" mostra o fim da linha pelo caractere Dollar ($). O seguinte exemplo SED é uma simulação do mesmo.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ cat -E test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1$
Line #2$
Vamos simular o comando usando SED.
[jerry]$ sed 's|$|&$|' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1$
Line #2$
Comando Cat -ET
O comando "cat -ET" mostra o símbolo de dólar ($) no final de cada linha e exibe os caracteres TAB como "^ I". O exemplo a seguir mostra a simulação do comando "cat -ET" usando SED.
[jerry]$ echo -e "Line #1\tLine #2" > test.txt
[jerry]$ cat -ET test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1^ILine #2$
Vamos simular o comando usando SED.
[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'
Ao executar o código acima, você obtém o seguinte resultado:
Line #1^ILine #2$
Comando nl
O comando "nl" simplesmente numera as linhas dos arquivos. O seguinte script SED simula esse comportamento.
[jerry]$ echo -e "Line #1\nLine #2" > test.txt
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'
Ao executar o código acima, você obtém o seguinte resultado:
1 Line #1
2 Line #2
A primeira expressão SED imprime números de linha seguidos de seu conteúdo, e a segunda expressão SED mescla essas duas linhas e converte caracteres de nova linha em caracteres TAB.
Comando cp
O comando "cp" cria outra cópia do arquivo. O seguinte script SED simula esse comportamento.
[jerry]$ sed -n 'w dup.txt' data.txt
[jerry]$ diff data.txt dup.txt
[jerry]$ echo $?
Ao executar o código acima, você obtém o seguinte resultado:
0
Expandir Comando
O comando "expandir" converte caracteres TAB em espaços em branco. O código a seguir mostra sua simulação.
[jerry]$ echo -e "One\tTwo\tThree" > test.txt
[jerry]$ expand test.txt > expand.txt
[jerry]$ sed 's/\t/ /g' test.txt > new.txt
[jerry]$ diff new.txt expand.txt
[jerry]$ echo $?
Ao executar o código acima, você obtém o seguinte resultado:
0
Comando Tee
O comando "tee" despeja os dados no fluxo de saída padrão, bem como no arquivo. A seguir está a simulação do comando "tee".
[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt
Line #1
Line #2
Vamos simular o comando usando SED.
[jerry]$ sed -n 'p; w new.txt' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Comando cat -s
O comando UNIX "cat -s" suprime linhas de saída vazias repetidas. O código a seguir mostra a simulação do comando "cat -s".
[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt
[jerry]$ cat -s test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Line #3
Vamos simular o comando usando SED.
[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Line #2
Line #3
Comando grep
Por padrão, o comando "grep" imprime uma linha quando uma correspondência de padrão é bem-sucedida. O código a seguir mostra sua simulação.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep "Line #1" test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Vamos simular o comando usando SED.
[jerry]$ sed -n '/Line #1/p' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #1
Comando grep -v
Por padrão, o comando "grep -v" imprime uma linha quando uma correspondência de padrão falha. O código a seguir mostra sua simulação.
[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt
[jerry]$ grep -v "Line #1" test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #2
Line #3
Vamos simular o comando usando SED.
[jerry]$ sed -n '/Line #1/!p' test.txt
Ao executar o código acima, você obtém o seguinte resultado:
Line #2
Line #3
Comando tr
O comando "tr" traduz caracteres. Dada a seguir é sua simulação.
[jerry]$ echo "ABC" | tr "ABC" "abc"
Ao executar o código acima, você obtém o seguinte resultado:
abc
Vamos simular o comando usando SED.
[jerry]$ echo "ABC" | sed 'y/ABC/abc/'
Ao executar o código acima, você obtém o seguinte resultado:
abc