GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie verwendet man Sed, um eine mehrzeilige Zeichenfolge zu ersetzen?

Das ist mir aufgefallen, wenn ich n hinzufüge zu einem Muster zum Ersetzen mit sed , es passt nicht. Beispiel:

$ 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

Wie kann ich das zum Laufen bringen?

Akzeptierte Antwort:

Im einfachsten Aufruf von sed , es hat eine Textzeile im Musterbereich, dh. 1 Zeile n durch Trennzeichen getrennter Text aus der Eingabe. Die einzelne Zeile im Musterraum hat kein n … Deshalb findet Ihre Regex nichts.

Sie können mehrere Zeilen in den Musterraum einlesen und Dinge überraschend gut manipulieren, aber mit einem mehr als normalen Aufwand.. Sed hat eine Reihe von Befehlen, die diese Art von Dingen ermöglichen ... Hier ist ein Link zu einer Befehlszusammenfassung für sed. Es ist das beste, das ich gefunden habe, und hat mich ins Rollen gebracht.

Vergessen Sie jedoch die „Einzeiler“-Idee, sobald Sie anfangen, die Mikrobefehle von sed zu verwenden. Es ist nützlich, es wie ein strukturiertes Programm anzulegen, bis Sie ein Gefühl dafür bekommen … Es ist überraschend einfach und ebenso ungewöhnlich. Man könnte es sich als die „Assembler-Sprache“ der Textbearbeitung vorstellen.

Zusammenfassung:Verwenden Sie sed für einfache Dinge und vielleicht ein bisschen mehr, aber im Allgemeinen bevorzugen die meisten Leute etwas anderes, wenn es über die Arbeit mit einer einzelnen Zeile hinausgeht…
Ich lasse jemand anderen etwas anderes vorschlagen Ich bin mir wirklich nicht sicher, was die beste Wahl wäre (ich würde sed verwenden, aber das liegt daran, dass ich Perl nicht gut genug kenne.)

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  

Hier ist es das gleiche Skript, komprimiert zu etwas, das offensichtlich schwieriger zu lesen und zu bearbeiten ist, aber manche würden es zweifelhaft als Einzeiler bezeichnen

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

Hier ist mein Befehl „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. So verwenden Sie den Linux-Befehl sed

  2. Verwenden von grep und sed zum Suchen und Ersetzen einer Zeichenfolge

  3. Wie verwendet man sed, um die Variable einer Konfigurationsdatei zu ersetzen?

  4. Mehrzeilige Sed ersetzen

  5. Wie kann man Zeichen rekursiv durch sed ersetzen?

So verwenden Sie MySQL-String-Funktionen

So verwenden Sie sed zum Suchen und Ersetzen von Zeichenfolgen in Dateien

So verwenden Sie den SED-Befehl zum Suchen und Ersetzen von Zeichenfolgen in Dateien

BENUTZUNG DES SED-EDITORS

Top 20 der zu verwendenden sed-Befehle

So verwenden Sie Sed zum Suchen und Ersetzen einer Zeichenfolge in einer Datei