La risposta è già data da questo user solo check here.
qualche riferimento
Nella convocazione semplice di sed, si ha una riga di testo nello spazio modello, vale a dire. 1 riga di testo delimitato da \ n dall'input. La singola linea nello spazio modello non ha \ n ... Ecco perché la tua espressione regolare non sta trovando nulla.
Puoi leggere più linee nello spazio modello e manipolare le cose sorprendentemente bene, ma con uno sforzo più che normale. Sed ha un set di comandi che permettono questo tipo di cose ... Ecco un link ad un Riepilogo comandi per sed. È il migliore che ho trovato e mi ha fatto rotolare.
Tuttavia, dimentica l'idea del "one-liner" una volta che inizi a utilizzare i micro-comandi di sed. È utile metterlo da parte come un programma strutturato fino a quando non ne hai la percezione ... È sorprendentemente semplice e ugualmente insolito. Si potrebbe pensare ad esso come al "linguaggio assemblatore" dell'editing di testo.
Sommario: Usa sed per le cose semplici, e forse un po 'di più, ma in generale, quando si arriva al di là di lavorare con una sola linea, la maggior parte delle persone preferisce qualcos'altro ... io sia qualcun altro a suggerire qualcosa di diverso .. sono davvero non sono sicuro che la scelta migliore sarebbe (userei sed, ma è perché non conosco abbastanza bene perl.)
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
Qui è lo stesso script, condensato in ciò che è ovviamente più difficile da leggere e lavorare, ma alcuni chiamerebbero dubbiamente un one-liner
sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;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
Sarebbe bello avere un [mcve] più generico per vedere cosa è costante e cosa no: deve essere su '/ var/www'? Inoltre, usare 'sed' per multilinea non sembra essere il modo più pulito:' awk' probabilmente può gestire meglio questo modo. – fedorqui