Im einfachsten Aufruf von sed enthält es eine Textzeile im Musterbereich, d. H. 1 Zeile \n
begrenzter Text aus der Eingabe. Die einzelne Zeile im Musterbereich hat keine \n
... Deshalb findet Ihr Regex nichts.
Sie können mehrere Zeilen in den Musterraum einlesen und die Dinge überraschend gut, aber mit mehr als normalem Aufwand manipulieren. Sed verfügt über eine Reihe von Befehlen, die diese Art von Dingen ermöglichen ... Hier ist ein Link zu einer Befehlsübersicht für sed . Es ist das beste, das ich gefunden habe und das mich ins Rollen gebracht hat.
Vergessen Sie jedoch die "Einzeiler" -Idee, sobald Sie mit der Verwendung der Mikrobefehle von sed beginnen. Es ist nützlich, es wie ein strukturiertes Programm anzuordnen, bis Sie das Gefühl dafür bekommen ... Es ist überraschend einfach und ebenso ungewöhnlich. Sie können es sich als die "Assemblersprache" der Textbearbeitung vorstellen.
Zusammenfassung: Verwenden Sie sed für einfache Dinge, und vielleicht auch für etwas mehr, aber im Allgemeinen bevorzugen die meisten Leute etwas anderes, wenn es über das Arbeiten mit einer einzelnen Zeile hinausgeht ...
Ich lasse jemanden etwas anderes vorschlagen Ich bin mir nicht sicher, was die beste Wahl sein würde. (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 test\nPlease do not$/not a test\nBe/
# 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, kondensierte in dem, was ist offensichtlich schwerer zu lesen und die Arbeit mit, aber einige würden unschlüssig nennen einen Einzeiler
sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;ty;P;D;:y}}' alpha.txt
Hier ist mein Befehl "Spickzettel"
: # 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