Na chamada mais simples de sed , tem uma linha de texto no espaço padrão, ie. 1 linha de texto delimitado por \n
da entrada. A única linha no espaço padrão não tem \n
... É por isso que o seu regex não está encontrando nada.
Você pode ler várias linhas no padrão de espaço e manipular as coisas surpreendentemente bem, mas com um esforço mais que normal. Sed tem um conjunto de comandos que permitem esse tipo de coisa ... Aqui está um link para a < a href="http://docstore.mik.ua/orelly/unix/sedawk/appa_03.htm"> Resumo de Comandos para sed . É o melhor que eu encontrei e me fez rolar.
No entanto, esqueça a ideia do "one-liner" quando começar a usar os micro-comandos do sed. É útil descrevê-lo como um programa estruturado até que você perceba ... É surpreendentemente simples e igualmente incomum. Você poderia pensar nisso como a "linguagem assembler" de edição de texto.
Resumo: Use sed para coisas simples, e talvez um pouco mais, mas em geral, quando fica além de trabalhar com uma única linha, a maioria das pessoas prefere algo diferente ...
Eu vou deixar alguém sugerir outra coisa .. Eu realmente não tenho certeza qual seria a melhor escolha (eu usaria sed, mas isso é porque eu não sei perl bem o suficiente.)
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
Aqui está o mesmo roteiro, condensado no que é obviamente mais difícil de ler e trabalhar, mas alguns chamariam duvidosamente de um verso
sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;ty;P;D;:y}}' alpha.txt
Aqui está o meu 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