GNU/Linux >> Belajar Linux >  >> Linux

Memanipulasi teks pada baris perintah dengan sed

Dalam artikel sebelumnya, saya membahas cara memanipulasi teks dengan grep . Sekarang, alihkan perhatian Anda ke sed (Stream Editor), yang paling cocok untuk digunakan dalam pipeline (data yang berasal dari pipa). sed utilitas dapat digunakan untuk mencetak konten file, mengganti satu baris (atau beberapa baris), dan kemudian menyimpan file. Berbeda dengan grep , sed dapat mengganti satu baris atau beberapa baris dalam file dan melakukan di tempat pembaruan file itu.

sed . yang paling sederhana doa saat mengganti foo untuk bar adalah:

$ sed 's/foo/bar/' inputfile

Contoh:Hapus komentar

Sementara grep dapat memformat output di layar, tidak dapat memodifikasi file di tempat. Untuk melakukan ini, Anda memerlukan editor file seperti ed . Sejak ed bukan bagian dari artikel ini, gunakan sed untuk mencapai hal yang sama yang Anda lakukan dengan grep dalam contoh pertama artikel sebelumnya. Kali ini ubah /etc/fstab file di tempat melewati -i tandai ke sed . Tanpa -i flag , Anda hanya akan melihat apa yang telah dimodifikasi.

Anda dianjurkan untuk selalu menjalankan sed tanpa -i bendera, hanya untuk memastikan bahwa hasil yang dihasilkannya diharapkan. sed utilitas juga menawarkan -i.bak flag, yang membuat file cadangan sebelum diedit.

grep final terakhir perintah untuk contoh ini adalah:

$ grep -v '^#' /etc/fstab > ~/fstab_without_comment

Dengan sed , Anda memiliki:

# sed -i '/^#/d' /etc/fstab

/dev/mapper/VGCRYPTO-ROOT /                       ext4    defaults,x-systemd.device-timeout=0 1 1
UUID=e9de0f73-ddddd-4d45-a9ba-1ffffa /boot                   ext4    defaults             1 2
LABEL=SSD_SWAP		swap		swap		defaults	0 0

Contoh:Cetak saja /etc/passwd pengguna

Di grep misalnya, Anda hanya mencetak nama pengguna dari /etc/passwd file dengan yang berikut:

$ grep -Eo '^[a-zA-Z_-]+' /etc/passwd

Anda dapat melakukan hal yang sama menggunakan sed sebagai berikut:

$ sed 's/^\([a-zA-Z_-]\+\).*/\1/' /etc/passwd

Dalam contoh di atas, Anda mengelompokkan kecocokan dengan tanda kurung () , lalu cetak grup yang cocok dengan \1 (referensi balik), yang menentukan kelompok pertama. Untuk grup kedua, Anda akan menggunakan \2 , dan seterusnya.

Contoh:Ganti semua foo dengan bar

Di sed , Anda dapat menelusuri pola, lalu hanya mengganti kemunculan yang cocok dengan pola tersebut. Untuk mengganti semua kemunculan dalam file inputfile1 dari foo ke bar secara global, jalankan:

$ sed -i '/foo/bar/g' inputfile1

Contoh:Ganti satu instance

Ambil file inputfile2 , yang isinya sebagai berikut:

hello world
second line should be replaced
this line should be replaced later

Katakan bahwa Anda ingin mengganti should dengan will , tetapi hanya untuk baris kedua. Perintah ini dipecah sebagai berikut:

$ sed '/second/s/should/will/' inputfile2
          |    |    |     |
          |    |    |     with this pattern 
          |    |    this pattern
          |    substitute   
         Search for the pattern "second"

Output ini dikirim ke output standar daripada mengganti isi file. Hasilnya terlihat seperti ini:

$ sed '/second/s/should/will/' inputfile2
hello world
second line will be replaced
this line should be replaced later

sed perintah peka huruf besar-kecil. Berikut ini tidak akan berfungsi saat Anda mencoba mengganti World dengan there :

$ echo "Hello World" | sed 's/world/there/'
Hello World

GNU sed memperkenalkan bendera baru, /I , yang mengabaikan kasus dan akan lakukan penggantian dengan perintah yang sama:

$ echo "Hello World" | sed 's/world/there/I'
Hello there

Contoh:Cetak rentang baris dan keluar

Dengan sed , Anda juga dapat mencetak baris dan keluar setelah kriteria Anda terpenuhi. Perintah berikut akan mencetak tiga baris dan keluar. Perintah ini:

$ sed -n '1,3p' /etc/passwd

setara dengan:

$ sed '3q' /etc/passwd

Berikut ini akan salah:

$ sed '1,3q' /etc/passwd # Wrong. You cannot quit three times 

Contoh:Beri komentar pada baris yang tidak diberi komentar

Ekspresi reguler juga dapat digunakan dengan sed , seperti yang ditunjukkan sebelumnya. Misalnya, Anda memiliki skrip kecil berikut:

$ cat test_script 
#/usr/bin/env bash

this is the first comment
This is another comment
# this is a comment too

echo "This is not a comment and should be echoed"

Anda sekarang harus melewati baris pertama, dimulai dengan #!/bin/bash , dan komentari baris ketiga dan keempat, tetapi bukan baris kelima karena baris itu sudah dikomentari.

Di sed , Anda dapat menggunakan sesuatu seperti berikut:

$ sed '3,6s/^[^#]/# &/g' test_script
#/usr/bin/env bash

# this is the first comment
# This is another comment
# this is a comment too

echo "This is not a comment and should be echoed"

Pada perintah di atas, berikut ini dilakukan:

  • 3,6s  mendefinisikan rentang, dari baris tiga hingga baris enam.
  • /^[^#]/ cocok dengan semua yang berupa karakter dan tidak dimulai dengan hash (# ).
  • /# &/g menggantikan bagian, dalam hal ini menempatkan # di depan baris yang ditentukan oleh & tanda tangan.

Contoh:Hapus semua digit

Aplikasi yang berbeda menghasilkan data dalam format yang berbeda. Dengan sed , Anda hanya dapat menyimpan data yang dapat digunakan. Misalnya, Anda memiliki file berikut (inputfile3 ) dalam format ini:

foo1234
bar99128
baz2842
qux12953
discard39120

Mungkin program menghasilkan format yang salah, atau menggabungkan bidang menjadi satu. Bagaimana jika Anda hanya tertarik untuk mempertahankan karakter alfa dan ingin membuang angkanya? Bagaimana Anda mencapai tujuan ini dengan sed ?

Jawabannya mungkin lebih mudah dari yang Anda pikirkan:

$ sed 's/\([a-z]*\).*/\1/' inputfile3
foo
bar
baz
qux
discard

Contoh:Ubah baris tertentu

Selanjutnya, sed juga dapat menangani rentang berdasarkan pola, yang berarti Anda dapat menentukan awal dan akhir string dan memanipulasi rentang. Misalnya:

$ cat inputfile4

hello world

start of the comment
another comment
end of a comment

dont comment this line
nor this line

Berikut sed perintah akan mengomentari baris yang dimulai dengan start dan diakhiri dengan end :

$ sed '/start/,/end/ s/^/# /' inputfile4 
hello world

# start of the comment
# another comment
# end of a comment

dont comment this line
nor this line

Singkirkan juga baris kosong.

$ sed '/start/,/end/ s/^/# /;/^$/d' inputfile4

hello world
# start of the comment
# another comment
# end of a comment
dont comment this line
nor this line

Masih banyak lagi yang bisa sed dan fitur-fiturnya yang kaya. Untuk dapat sepenuhnya menggunakan sed 's ability, silakan lihat halaman dokumentasinya, yang dapat Anda temukan di sini. Juga, sumber informasi yang bagus tentang sed dapat ditemukan di sini.

Penutup

Seperti yang telah saya bahas sebelumnya, Anda akan menggunakan grep ketika Anda ingin mencari pola, baik dalam file atau beberapa direktori secara rekursif. Gunakan sed jika Anda menerima data dari pipeline, atau ingin memanipulasi data dengan cepat.

sed perintah ditulis dan mudah dipelajari untuk melakukan operasi dasar. Yang Anda butuhkan hanyalah latihan, terutama dengan ekspresi reguler.


Linux
  1. Bekerja dengan pipa di baris perintah Linux

  2. Multi-Tugas di baris perintah dengan screenie

  3. Memanipulasi X Key Dan Pointer Grabs Di Command Line?

  1. Ganti kutipan pintar dengan perintah sed Linux

  2. Belajar menggunakan editor teks Sed

  3. Bagaimana Cara Menyisipkan Teks Sebelum Baris Pertama Sebuah File?

  1. Diurutkan dengan sort di baris perintah

  2. Menavigasi sistem file dengan jalur relatif di baris perintah

  3. Bekerja dengan aliran data di baris perintah Linux