GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana Cara Menggunakan Sed Untuk Mengganti String Multi-baris?

Saya perhatikan, jika saya menambahkan n ke pola untuk mengganti menggunakan sed , tidak cocok. Contoh:

$ cat > alpha.txt
This is
a test
Please do not
be alarmed

$ sed -i'.original' 's/a testnPlease do not/not a testnBe/' alpha.txt

$ diff alpha.txt{,.original}

$ # No differences printed out

Bagaimana saya bisa membuatnya bekerja?

Jawaban yang Diterima:

Dalam panggilan paling sederhana sed , ia memiliki satu baris teks dalam ruang pola, yaitu. 1 baris n teks yang dipisahkan dari input. Satu baris dalam ruang pola tidak memiliki n … Itu sebabnya ekspresi reguler Anda tidak menemukan apa pun.

Anda dapat membaca beberapa baris ke dalam ruang pola dan memanipulasi hal-hal dengan sangat baik, tetapi dengan upaya yang lebih dari biasanya.. Sed memiliki serangkaian perintah yang memungkinkan hal semacam ini… Berikut ini tautan ke Ringkasan Perintah untuk sed. Ini adalah yang terbaik yang pernah saya temukan, dan membuat saya bersemangat.

Namun, lupakan ide "satu baris" setelah Anda mulai menggunakan perintah mikro sed. Sangat berguna untuk meletakkannya seperti program terstruktur sampai Anda merasakannya… Ini sangat sederhana, dan juga tidak biasa. Anda dapat menganggapnya sebagai "bahasa penyusun" pengeditan teks.

Ringkasan:Gunakan sed untuk hal-hal sederhana, dan mungkin sedikit lebih, tetapi secara umum, ketika melampaui bekerja dengan satu baris, kebanyakan orang lebih suka sesuatu yang lain…
Saya akan membiarkan orang lain menyarankan sesuatu yang lain.. Saya 'm benar-benar tidak yakin apa pilihan terbaik (saya akan menggunakan sed, tapi itu karena saya tidak tahu Perl cukup baik.)

sed '/^a test$/{
       $!{ N        # append the next line when not on the last line
         s/^a testnPlease do not$/not a testnBe/
                    # now test for a successful substitution, otherwise
                    #+  unpaired "a test" lines would be mis-handled
         t sub-yes  # branch_on_substitute (goto label :sub-yes)
         :sub-not   # a label (not essential; here to self document)
                    # if no substituion, print only the first line
         P          # pattern_first_line_print
         D          # pattern_ltrunc(line+nl)_top/cycle
         :sub-yes   # a label (the goto target of the 't' branch)
                    # fall through to final auto-pattern_print (2 lines)
       }    
     }' alpha.txt  

Ini adalah skrip yang sama, diringkas menjadi apa yang jelas lebih sulit untuk dibaca dan digunakan, tetapi beberapa orang akan dengan ragu menyebut satu baris

sed '/^a test$/{$!{N;s/^a testnPlease do not$/not a testnBe/;ty;P;D;:y}}' alpha.txt

Ini perintah saya "cheat-sheet"

:  # label
=  # line_number
a  # append_text_to_stdout_after_flush
b  # branch_unconditional             
c  # range_change                     
d  # pattern_delete_top/cycle          
D  # pattern_ltrunc(line+nl)_top/cycle 
g  # pattern=hold                      
G  # pattern+=nl+hold                  
h  # hold=pattern                      
H  # hold+=nl+pattern                  
i  # insert_text_to_stdout_now         
l  # pattern_list                       
n  # pattern_flush=nextline_continue   
N  # pattern+=nl+nextline              
p  # pattern_print                     
P  # pattern_first_line_print          
q  # flush_quit                        
r  # append_file_to_stdout_after_flush 
s  # substitute                                          
t  # branch_on_substitute              
w  # append_pattern_to_file_now         
x  # swap_pattern_and_hold             
y  # transform_chars                   

Linux
  1. Gunakan Perintah SED untuk Menemukan dan Mengganti String di File - Bagaimana cara melakukan tugas ini di Ubuntu?

  2. Bagaimana Cara Mengganti String Dalam File?

  3. Bagaimana Mengganti String Dengan String Yang Mengandung Slash Dengan Sed?

  1. Bagaimana Cara Menggunakan Sed Atau Ex Untuk Mengganti Blok (Kode multi-baris) Dengan Blok Teks (kode) Baru?

  2. Gunakan Sed Untuk Mengganti String Dengan Satu yang Mengandung Nama Direktori (yaitu Slash “/”)?

  3. Menggunakan grep dan sed untuk mencari dan mengganti string

  1. Cara mengganti string dalam banyak file di baris perintah linux

  2. Cara menggunakan sed untuk mengekstrak substring

  3. Multi-Line Sed Ganti