您的回答已经由user提供,只是check here。
一些参考
在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
如果有一个更通用的[mcve]来查看什么是常量,哪些不是:是否必须在'/ var/www'上?另外,使用'sed'作为多行似乎不是最干净的方式:'awk'可以更好地处理这种方式。 – fedorqui