Blog Posts » Linux » linux find and replace menggunakan regex (sed)

linux find and replace menggunakan regex (sed)

Ketika saya ingin menghapus semua package (sebut saja paket) yang telah ter-download misal di var/cache/apt/archives beserta dependency-nya sekaligus, saya ingin membuat skrip / otomatisasi nya berdasarkan langkah-langkah berikut:

1. Cari semua file ekstensi .deb
2. Ambil hanya nama paket nya. Misal file python3-gi-cairo_3.14.0-1_i386.deb nama paketnya adalah python3-gi-cairo. Diketahui bahwa nama paket file .deb (dari repositori resmi) adalah sebelum karakter _ (underscore) pertama.
3. Hapus menggunakan apt-get purge

Untuk saat ini saya belum menemukan cara yang paling cepat dan simple. Setelah browsing, saya menemukan command yang bisa mengakomodasi find and replace menggunakan regular-expression (regex) yaitu sed. kebetulan sed sudah built-in dan tidak perlu mengistall paket sed di linux.
Cara yang saya gunakan menurut saya belum sempurna namun setidaknya bisa berfungsi dengan baik :D
Berikut cara yang saya gunakan:

1. Cari semua file ekstensi .deb
[Textarea][RAW][Download]

  1. find . -type f -name '*.deb' > /tmp/paket.log


Keterangan:
Tentunya bisa anda ubah tanda "." sesuai direktori anda.
Tanda > untuk menyimpan hasil pencarian ke temporary paket.log, jika sudah ada file paket.log akan di-rewrite. kalau menggunakan tanda >> akan di-append atau ditambahkan setelah baris terakhir.

Contoh hasil pencarian yang tersimpan di paket.log:
[Textarea][RAW][Download]

  1. ./Downloads/catfish/python3-gi-cairo_3.14.0-1_i386.deb
  2. ./Downloads/catfish/python3-pexpect_3.2-1_all.deb
  3. ./Downloads/catfish/catfish_1.2.2-1_all.deb
  4. ./Downloads/ppp/libwvstreams4.6-base_4.6.1-7_i386.deb
  5. ./Downloads/ppp/wvdial_1.61-4.1_i386.deb
  6. ./Downloads/ppp/libwvstreams4.6-extras_4.6.1-7_i386.deb
  7. ./Downloads/ppp/libuniconf4.6_4.6.1-7_i386.deb
  8. ./Downloads/sk1/blt_2.5.3+dfsg-1_i386.deb
  9. ./Downloads/sk1/python-tk_2.7.8-2+b1_i386.deb
  10. ./Downloads/sk1/python-sk1-0.9.3_1debian_7.8_i386.deb
  11. ./Downloads/sk1/tk8.6-blt2.5_2.5.3+dfsg-1_i386.deb
  12. ./Downloads/build-essential/libalgorithm-diff-perl_1.19.02-3_all.deb
  13. ./Downloads/build-essential/g++_4%3a4.9.2-2_i386.deb
  14. ./Downloads/build-essential/build-essential_11.7_i386.deb
  15. ./Downloads/build-essential/libstdc++-4.9-dev_4.9.2-10_i386.deb
  16. ./Downloads/build-essential/dpkg-dev_1.17.27_all.deb
  17. ./Downloads/build-essential/libalgorithm-merge-perl_0.08-2_all.deb
  18. ./Downloads/build-essential/libalgorithm-diff-xs-perl_0.04-3+b1_i386.deb
  19. ./Downloads/build-essential/g++-4.9_4.9.2-10_i386.deb


2. Ambil hanya nama paket nya.
Misal pada baris pertama ./Downloads/catfish/python3-gi-cairo_3.14.0-1_i386.deb kita ambil teks python3-gi-cairo yaitu antara / (slash) dan _ (underscore).
Cara ini memanfaatkan regex pada command sed.
[Textarea][RAW][Download]

  1. sed -r 's/.+\/([^\/_]+)_.+\.deb/\1/g' /tmp/paket.log


Keterangan: opsi -r untuk mengaktifkan regex extended yaitu agar bisa menggunakan ?, +, dan grouping.

Hasilnya adalah:
[Textarea][RAW][Download]

  1. user@hostname:~$ sed -r 's/.+\/([^\/_]+)_.+\.deb/\1/g' /tmp/paket.log
  2. python3-gi-cairo
  3. python3-pexpect
  4. catfish
  5. libwvstreams4.6-base
  6. wvdial
  7. libwvstreams4.6-extras
  8. libuniconf4.6
  9. blt
  10. python-tk
  11. python-sk1-0.9.3
  12. tk8.6-blt2.5
  13. libalgorithm-diff-perl
  14. g++
  15. build-essential
  16. libstdc++-4.9-dev
  17. dpkg-dev
  18. libalgorithm-merge-perl
  19. libalgorithm-diff-xs-perl
  20. g++-4.9


3. Hapus menggunakan apt-get purge.
apt-get dengan opsi purge menghapus bersih paket beserta config-nya dari system.
[Textarea][RAW][Download]

  1. apt-get purge $(sed -r 's/.+\/([^\/_]+)_.+\.deb/\1/g' /tmp/paket.log)


Keterangan:
Perintah didalam perintah. http://askubuntu.com/questions/7404/can-i-run-a-command-within-another-command
Selain menggunakan apt-get bisa juga menggunakan dpkg, jika anda sudah terbiasa dengan dpkg. Dan yang pasti sesuaikan dengan distro masing-masing.

Jadi semua perintah diatas jika disatukan bisa seperti ini:
[Textarea][RAW][Download]

  1. find . -name '*.deb' > /tmp/paket.log && apt-get purge $(sed -r 's/.+\/([^\/_]+)_.+\.deb/\1/g' /tmp/paket.log)


Apakah anda punya cara yang lebih baik? silahkan berbagi di komentar :)
Terakhir dari saya. Do it at your own risk. Salam.

(admin.anggit.com)