В простейшем вызове sed он имеет одну строку текста в пространстве шаблона, т.е. 1 строка \n
текста с разделителями из ввода. У единственной строки в пространстве шаблонов нет \n
... Вот почему ваше регулярное выражение ничего не находит.
Вы можете читать несколько строк в шаблонном пространстве и удивительно хорошо управлять вещами, но с усилиями, превышающими обычные. У Sed есть набор команд, которые позволяют такие вещи ... Вот ссылка на Сводку команд для sed , Это лучший, который я нашел, и заставил меня кататься.
Однако, если вы начнете использовать микро-команды sed, забудьте об идее «одной строки». Полезно выложить его как структурированную программу, пока не почувствуете это ... Это удивительно просто и не менее необычно. Вы можете думать об этом как о «языке ассемблера» редактирования текста.
Резюме: используйте sed для простых вещей, и, возможно, немного больше, но в целом, когда это выходит за рамки работы с одной строкой, большинство людей предпочитают что-то другое ...
Я позволю кому-то еще предложить что-то еще ... Я на самом деле не уверен, какой будет лучший выбор (я бы использовал sed, но это потому, что я недостаточно хорошо знаю 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
Здесь тот же сценарий, сжатый в то, что, очевидно, труднее читать и работать, но некоторые сомнительно назвали бы одну строку
sed '/^a test$/{$!{N;s/^a test\nPlease do not$/not a test\nBe/;ty;P;D;:y}}' alpha.txt
Вот моя команда "шпаргалка"
: # 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