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