# 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!!!
The particular netbooks was beautifully made with woodsmen in your mind, helping to make all of them an outstanding accomplice in the Term. https://imgur.com/a/7OHK5tD https://imgur.com/a/fEwN4Ns https://imgur.com/a/23XC6z7 https://imgur.com/a/AnSGHeA https://imgur.com/a/X1u5qIj https://imgur.com/a/rIdNYXe https://imgur.com/a/ccbqGyG
ReplyDelete