GNU/Linux >> Linux Esercitazione >  >> Linux

Come utilizzare Sed per sostituire una stringa multilinea?

L'ho notato, se aggiungo n a un modello per la sostituzione usando sed , non corrisponde. Esempio:

$ 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

Come posso farlo funzionare?

Risposta accettata:

Nella più semplice vocazione di sed , ne ha uno riga di testo nello spazio del modello, ad es. 1 riga di n testo delimitato dall'input. La singola riga nello spazio del modello non ha n ... Ecco perché la tua espressione regolare non trova nulla.

Puoi leggere più righe nello spazio del modello e manipolare le cose sorprendentemente bene, ma con uno sforzo più del normale.. Sed ha una serie di comandi che consentono questo tipo di cose... Ecco un collegamento a un Sommario dei comandi per sed. È il migliore che ho trovato e mi ha fatto girare.

Tuttavia, dimentica l'idea "one-liner" una volta che inizi a utilizzare i micro-comandi di sed. È utile disporlo come un programma strutturato finché non ne hai la sensazione... È sorprendentemente semplice e altrettanto insolito. Potresti pensarlo come il "linguaggio di assemblaggio" della modifica del testo.

Riepilogo:Usa sed per cose semplici, e forse un po' di più, ma in generale, quando va oltre il lavoro con una singola riga, la maggior parte delle persone preferisce qualcos'altro...
Lascerò che qualcun altro suggerisca qualcos'altro.. I Non sono davvero sicuro di quale sarebbe la scelta migliore (io userei sed, ma è perché non conosco abbastanza bene il perl.)

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  

Qui è lo stesso copione, condensato in ciò che è ovviamente più difficile da leggere e lavorare, ma alcuni chiamerebbero dubbiosamente una battuta

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

Ecco il mio comando "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. Usa il comando SED per trovare e sostituire la stringa nei file - Come eseguire questa attività su Ubuntu?

  2. Come utilizzare Sed o Ex per sostituire un blocco (codice multilinea) con un nuovo blocco di testo (codice)?

  3. Utilizzare Sed per sostituire una stringa con una contenente un nome di directory (ad esempio una barra "/")?

  4. Utilizzo di grep e sed per trovare e sostituire una stringa

  5. Come sostituire una stringa in più file nella riga di comando di Linux

Come utilizzare le funzioni di stringa MySQL

Come utilizzare sed per trovare e sostituire la stringa nei file

Come utilizzare il comando SED per trovare e sostituire la stringa nei file

COME USARE SED EDITOR

I 20 migliori comandi sed da usare

Come utilizzare Sed per trovare e sostituire una stringa in un file