Searching...
May 30, 2014
Friday, May 30, 2014

Mastering SED [Stream Editor]

Pernah membaca sed dalam sebuah command line? Belum? Perhatikan ini.

# echo "My name is Windows" | sed s/Windows/Linux/


Tertarik? Mari kita mulai dari berkenalan dengan Tn. Sed.


Pertanyaan pertama mungkin, apa yang dilakukan oleh Tn. Sed pada perintah di atas?

SED adalah kependekan dari Stream EDitor. Dimana stream (aliran) yang dimaksud?

Ini adalah input dari command line

# echo "My name is Windows"

Ini adalah output dari command line

My name is Windows

Kamu tidak melihat stream (alirannya), karena dia melewati pipe (pipa) untuk sampai ke output. Mungkinkah kita mengubah alirannya? Tentu saja. Dengan cara menambahkan pipe lain yang memiliki fungsi mengubah stream sebelumnya.

INPUT -> [PIPE] -> OUTPUT -> [PIPE] SED -> OUTPUT

INPUT echo, melewati sebuah jalur menuju OUTPUT. OUTPUT akan menuju [PIPE SED] yang akan melewati OUTPUT terakhir.

Jadi bagaimana dengan

# echo "My name is Windows" | sed s/Windows/Linux/

Perhatikan "|", lambang ini disebut dengan "PIPE" (pipa). Pipa ini mengalirkan output dari

# echo "My name is Windows"

ke

sed s/Windows/Linux/

SED harus memiliki standard input. Dimana dia mendapatkan standard input? Perhatikan kembali

INPUT -> [PIPE] -> OUTPUT -> [PIPE] SED -> OUTPUT

OUTPUT pertama MASUK ke dalam [PIPE] SED. Apapun yang masuk akan disebut input bukan? Maka kesimpulannya adalah, INPUT SED didapatkan dari OUTPUT ECHO. Masuk akal?

Perintah

# echo "My name is Windows"

akan menghasilkan

My name is Windows

Yang kemudian mengalir ke [PIPE] SED, dimana di dalam ini terdapat proses

sed s/Windows/Linux/

yang berfungsi mengganti (s = substitution) Windows, menjadi Linux

maka hasil akhirnya adalah

My name is Linux

SED LEVEL: 1

Mengenal esensi SED

sed s/Windows/Linux/

s : substitusi
/ : delimiter
Windows : string lama
Linux : string baru

Pada umumnya, sed memiliki 3 (tiga) delimiter. Delimiter yang digunakan oleh SED TIDAK hanya "/" (slash). Kamu juga bisa menggunakan "_" (underscore), ":" (colon), "-" (dash), apapun! Pastikan kamu menggunakan delimiter yang sama dalam satu PIPE.

Menggunakan underscore sebagai delimiter

echo "My name is Windows" | sed s_Windows_Linux_


Menggunakan colon sebagai delimiter

echo "My name is Windows" | sed s:Windows:Linux:


Menggunakan dash sebagai delimiter

echo "My name is Windows" | sed s-Windows-Linux-


Case 1

echo "You are using /bin/bash"

Jika kamu menggunakan delimiter slash, bagaimana mengubah /bin/bash menjadi /usr/bin/zsh?

Begini?

echo "You are using /bin/bash" | sed s//bin/bash//usr/bin/zsh/

Tidak! Lihat kembali /bin/bash, dia memiliki karakter slash, dimana slash juga dipakai sebagai delimiter sed kita. Kita harus mengkutip /bin/bash dan /usr/bin/zsh. Ada banyak cara untuk mengkutip string yang memiliki karatker yang sama dengan delimiter sed yang kita pakai. Biasanya kita menggunakan "\" backlash untuk melakukan exception terhadap karakter "/" slash.

echo "You are using /bin/bash" | sed 's/\/bin\/bash/\/usr\/bin\/zsh/'


Jika kita menggunakan delimiter SELAIN slash, ini akan menjadi lebih mudah. Kita tidak perlu lagi melakukan exception terhadap karaker "/" slash. Misalnya ":" colon.

echo "You are using /bin/bash" | sed 's:/bin/bash:/usr/bin/zsh:'


Matching Pattern

Sed juga bisa digunakan untuk mencari pattern yang cocok. Biasanya kita menggunakan perintah GREP, namun SED juga bisa melakukan ini.

Case 2

echo "abcde 12345"

Bagaimana cara menemukan 12345 dalam suatu output? Biasanya kita menggunakan GREP dalam hal ini

echo "abcde 12345" | grep 12345


Kita sedang membicarakan SED kan? Jadi bagaimana jika menggunakan SED?

echo "abcde 12345" | sed 's/[0-9][0-9]*/(&)/'


Atau

echo "abcde 12345" | sed 's/[0-9][0-9]*/"&"/'

Atau

echo "abcde 12345" | sed 's/[0-9].*/(&)/'

Atau

echo "abcde 12345" | sed 's/[0-9][0-9]*/[&]/'

Bagaimana jika hanya pattern yang memiliki unsur huruf?

echo "abcde 12345" | sed 's/[a-z]*/[&]/'


Menjaga bagian dari suatu pattern

Case 3

echo "abcde12345fghijk"

Mencetak abcdefghijk (mengeleminasi angka).

echo "abcde12345fghij" | sed 's/[0-9][0-9]*//'

Pada dasarnya, sed hanya akan mencari unsur bilangan, kemudian meng-substitusikannya dengan NULL. Artinyam menghapus semua unsur bilangan yang ditemukan.


Atau bisa juga dengan

echo "abcde12345fghij" | sed 's/12345//'

Tapi ini tidak efektif jika ternyata ada deretan angka yang tidak beraturan dan memiliki dua baris output

echo -e "abcde12345fghij\nklmno67890pqrstu" | sed 's/12345//'


Jika kita kembali ke perintah awal

echo -e "abcde12345fghij\nklmno67890pqrstu" | sed 's/[0-9][0-9]*//'


MORE TO COME!!!


1 comment:

 
Back to top!