Edytor strumieni - przydatne przepisy

SED to niesamowite narzędzie, które pozwala na wiele sposobów rozwiązania problemu. To jest sposób UNIX, a SED doskonale to potwierdza. GNU / Linux zapewnia wiele przydatnych narzędzi do wykonywania codziennych zadań. Przeprowadźmy symulację kilku narzędzi za pomocą SED. Czasami może się wydawać, że rozwiązujemy łatwy problem na własnej skórze, ale celem jest po prostu zademonstrowanie mocy SED.

Cat Command

W poniższym przykładzie każdy wiersz jest drukowany jako część domyślnego przepływu pracy.

[jerry]$ sed '' books.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

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

Poniższy przykład używa polecenia print, aby wyświetlić zawartość pliku.

[jerry]$ sed -n 'p' books.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

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

Usuwanie pustych linii

W poniższym przykładzie „^ $” oznacza pusty wiersz, a puste wiersze są usuwane, gdy dopasowanie do wzorca się powiedzie.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed '/^$/d'

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1 
Line #2

Podobnie poniższy przykład drukuje wiersz tylko wtedy, gdy nie jest pusty.

[jerry]$ echo -e "Line #1\n\n\nLine #2" | sed -n '/^$/!p'

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1 
Line #2

Usuwanie skomentowanych wierszy z programu C ++

Stwórzmy przykładowy program w C ++.

#include <iostream> 
using namespace std; 

int main(void) 
{ 
   // Displays message on stdout. 
   cout >> "Hello, World !!!" >> endl;  
   return 0; // Return success. 
}

Teraz usuń komentarze, używając następującego wyrażenia regularnego.

[jerry]$ sed 's|//.*||g' hello.cpp

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

#include <iostream>
using namespace std; 

int main(void) 
{ 
   cout >> "Hello, World !!!" >> endl; 
   return 0;  
}

Dodawanie komentarzy przed określonymi wierszami

Poniższy przykład dodaje komentarze przed wierszami o numerach od 3 do 5.

[jerry]$ sed '3,5 s/^/#/' hello.sh

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

#!/bin/bash 
#pwd 
#hostname 
#uname -a 
who 
who -r 
lsb_release -a

Wc -l polecenie

Polecenie „wc -l” zlicza liczbę wierszy znajdujących się w pliku. Poniższe wyrażenie SED symuluje to samo.

[jerry]$ sed -n '$ =' hello.sh

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

8

Dowództwo

Domyślnie polecenie head drukuje pierwsze 10 wierszy pliku. Zasymulujmy to samo zachowanie z SED.

[jerry]$ sed '10 q' books.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

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

Ogon -1 Polecenie

„Ogon -1” wypisuje ostatnią linię pliku. Poniższa składnia przedstawia jego symulację.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1 
Line #2

Napiszmy skrypt SED.

[jerry]$ sed -n '$p' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #2

Polecenie Dos2unix

W środowisku DOS znak nowej linii jest reprezentowany przez kombinację znaków CR / LF. Poniższa symulacja polecenia "dos2unix" konwertuje znak nowego wiersza DOS na znak nowego wiersza UNIX. W systemie GNU / Linux ten znak jest często traktowany jako znak „^ M” (Control M).

[jerry]$ echo -e "Line #1\r\nLine #2\r" > test.txt 
[jerry]$ file test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

test.txt: ASCII text, with CRLF line terminators

Symulujmy polecenie za pomocą SED.

[jerry]$ sed 's/^M$//' test.txt > new.txt   # Press "ctrl+v" followed "ctrl+m" to generate 
"^M" character. 
[jerry]$ file new.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

new.txt: ASCII text

Teraz wyświetlmy zawartość pliku.

[jerry]$ cat -vte new.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1$ 
Line #2$

Polecenie Unix2dos

Podobnie do "dos2unix", istnieje polecenie "unix2dos", które konwertuje znak nowej linii UNIX na znak nowej linii DOS. Poniższy przykład przedstawia symulację tego samego.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ file test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

test.txt: ASCII text

Symulujmy polecenie za pomocą SED.

[jerry]$ sed 's/$/\r/' test.txt  > new.txt 
[jerry]$ file new.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

new.txt: ASCII text, with CRLF line terminators

Teraz wyświetlmy zawartość pliku.

Now let us display the file contents.

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1^M$ 
Line #2^M$

Polecenie Cat -E

Polecenie „cat -E” pokazuje koniec wiersza znakiem dolara ($). Poniższy przykład SED to symulacja tego samego.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ cat -E test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1$ 
Line #2$

Symulujmy polecenie za pomocą SED.

[jerry]$ sed 's|$|&$|' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1$ 
Line #2$

Polecenie Cat -ET

Polecenie „cat -ET” wyświetla symbol dolara ($) na końcu każdego wiersza i wyświetla znaki tabulacji jako „^ I”. Poniższy przykład przedstawia symulację polecenia „cat -ET” przy użyciu SED.

[jerry]$ echo -e "Line #1\tLine #2" > test.txt 
[jerry]$ cat -ET test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1^ILine #2$

Symulujmy polecenie za pomocą SED.

[jerry]$ sed -n 'l' test.txt | sed 'y/\\t/^I/'

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1^ILine #2$

nl Command

Polecenie „nl” po prostu numeruje linie plików. Poniższy skrypt SED symuluje to zachowanie.

[jerry]$ echo -e "Line #1\nLine #2" > test.txt 
[jerry]$ sed = test.txt | sed 'N;s/\n/\t/'

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

1 Line #1 
2 Line #2

Pierwsze wyrażenie SED drukuje numery wierszy, po których następuje ich zawartość, a drugie wyrażenie SED scala te dwa wiersze i konwertuje znaki nowego wiersza na znaki TAB.

cp Command

Polecenie "cp" tworzy kolejną kopię pliku. Poniższy skrypt SED symuluje to zachowanie.

[jerry]$ sed -n 'w dup.txt' data.txt 
[jerry]$ diff data.txt dup.txt 
[jerry]$ echo $?

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

0

Rozwiń polecenie

Polecenie „expand” konwertuje znaki TAB na białe spacje. Poniższy kod przedstawia jego symulację.

[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 $?

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

0

Tee Command

Polecenie „tee” zrzuca dane do standardowego strumienia wyjściowego oraz do pliku. Poniżej podano symulację polecenia „tee”.

[jerry]$ echo -e "Line #1\nLine #2" | tee test.txt  
Line #1 
Line #2

Symulujmy polecenie za pomocą SED.

[jerry]$ sed -n 'p; w new.txt' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1 
Line #2

cat -s Command

Polecenie „cat -s” systemu UNIX blokuje powtarzające się puste wiersze wyjściowe. Poniższy kod przedstawia symulację polecenia „cat -s”.

[jerry]$ echo -e "Line #1\n\n\n\nLine #2\n\n\nLine #3" > test.txt  
[jerry]$ cat -s test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1  
Line #2
Line #3

Symulujmy polecenie za pomocą SED.

[jerry]$ sed '1s/^$//p;/./,/^$/!d' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1  
Line #2  
Line #3

grep Command

Domyślnie polecenie „grep” drukuje wiersz, gdy dopasowanie wzorca powiedzie się. Poniższy kod przedstawia jego symulację.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep "Line #1" test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1

Symulujmy polecenie za pomocą SED.

[jerry]$ sed -n '/Line #1/p' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #1

grep -v Polecenie

Domyślnie polecenie „grep -v” wyświetla wiersz, gdy dopasowanie wzorca nie powiedzie się. Poniższy kod przedstawia jego symulację.

[jerry]$ echo -e "Line #1\nLine #2\nLine #3" > test.txt  
[jerry]$ grep -v "Line #1" test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #2 
Line #3

Symulujmy polecenie za pomocą SED.

[jerry]$ sed -n '/Line #1/!p' test.txt

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Line #2 
Line #3

tr Command

Polecenie „tr” tłumaczy znaki. Poniżej podano jego symulację.

[jerry]$ echo "ABC" | tr "ABC" "abc"

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

abc

Symulujmy polecenie za pomocą SED.

[jerry]$ echo "ABC" | sed 'y/ABC/abc/'

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

abc