У найпростішому виклику sed , він має один рядок тексту в просторі візерунка, тобто. 1 рядок з \n
обмеженим текстом від введення. У єдиному рядку в просторі шаблону немає \n
... Ось чому ваш регулярний вираз нічого не знаходить.
Ви можете читати декілька рядків у просторі шаблонів і маніпулювати речами на диво добре, але з більш ніж звичайним зусиллям. У Sed є набір команд, які дозволяють робити такий тип речей ... Ось посилання на Зведення команд для sed . Це найкраще, що я знайшов, і змусив мене кататися.
Однак забудьте ідею "однолінійний", як тільки ви почнете використовувати мікрокоманди sed. Корисно викласти її як структуровану програму, поки ви не відчуєте її ... Це напрочуд просто і не менш незвично. Ви можете подумати про це як про "мову асемблера" редагування тексту.
Резюме: Використовуйте sed для простих речей, а може і трохи більше, але загалом, коли це виходить за рамки роботи з однією лінією, більшість людей віддають перевагу чомусь іншому ...
Я дозволю, щоб хтось інший запропонував щось інше .. Я насправді не впевнений, що буде найкращим вибором (я б використовував sed, але це тому, що я не знаю перл досить добре.)
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