Awk Sed-在两个模式之间存在的多行模式之前插入多行

Awk Sed-在两个模式之间存在的多行模式之前插入多行,awk,sed,insert,pattern-matching,Awk,Sed,Insert,Pattern Matching,我尝试使用sed在$orig之前插入$new,位于$Initial和$Final之间,如下所示: Initial="# Introduction"; \ Final="# External links"; \ orig="\n#(.*)\n"; \ new="\n<p><a href="#top" accesskey="t">[Top]</a></p>"; \ file="Input.md"; \ sed -i -r -e "\!$Initial!

我尝试使用
sed
$orig
之前插入
$new
,位于
$Initial
$Final
之间,如下所示:

Initial="# Introduction"; \
Final="# External links"; \
orig="\n#(.*)\n"; \
new="\n<p><a href="#top" accesskey="t">[Top]</a></p>"; \
file="Input.md"; \
sed -i -r -e "\!$Initial!,\!$Final!!^$orig!i $new!g" $file ; \

预期输出文件:

# Dummy

# Introduction

-

<p><a href="#top" accesskey="t">[Top]</a></p>

# Summary

-

<p><a href="#top" accesskey="t">[Top]</a></p>

### See also

-

<p><a href="#top" accesskey="t">[Top]</a></p>

## References

-

<p><a href="#top" accesskey="t">[Top]</a></p>

# External links

# Dummy
我知道插入语法是

sed -i '/pattern/i TextToInsert ' inputfile
所以我像前面说的那样用棍棒打了这两个


我认为问题在于
orig=“\\n#(.*)\\n”\sed-i-r-e“\!$Initial!,\!$Final!!^$orig!i$new!g”$文件中使用sed的语法\

sed用于执行s/old/new,仅此而已。为了简单、清晰、健壮、可移植性等,您应该使用awk

这就是您试图做的(在makefile之外)

$awk'
f&&^#/{print“

\n”} /^#引言/{f=1} /^#外部链接/{f=0} {print} "档案" #假人 #导言 -

#总结 -

###另见 -

##参考资料 -

#外部链接 #假人

如果您想要“就地编辑”,您可以使用GNU awk使用
awk-i inplace…
,就像您可以使用GNU sed使用
sed-i…

sed用于执行s/old/new,仅此而已。为了简单、清晰、健壮、可移植性等,您应该使用awk

这就是您试图做的(在makefile之外)

$awk'
f&&^#/{print“

\n”} /^#引言/{f=1} /^#外部链接/{f=0} {print} "档案" #假人 #导言 -

#总结 -

###另见 -

##参考资料 -

#外部链接 #假人
如果您想要“就地编辑”,您可以使用GNU awk使用
awk-i inplace…
,就像您可以使用GNU sed使用
sed-i…

这可能适合您(GNU sed):

sed-i-e'/^#外部链接/h;x、 /^#导言/{x;/^#/i

\n'-e'x};x、 /^#简介/h'文件
使用保留空间(附加缓冲区)标记何时插入所需的行。当遇到
#简介
时,将标志设置为打开,当遇到
#外部链接
时,将标志设置为关闭。当标志处于启用状态时,请在任何行首前插入两行
#

这可能适用于您(GNU-sed):

sed-i-e'/^#外部链接/h;x、 /^#导言/{x;/^#/i

\n'-e'x};x、 /^#简介/h'文件

使用保留空间(附加缓冲区)标记何时插入所需的行。当遇到
#简介
时,将标志设置为打开,当遇到
#外部链接
时,将标志设置为关闭。当标志处于启用状态时,在任何行首前插入两行
#

“不起作用”非常模糊。。。请张贴您尝试的输入/输出。通过快速扫描,您使用了嵌套引号,这可能是您的问题的一部分。@HardcoreHenry请查看编辑您应该在更改前后发布您正在更改的文本(带有预期结果和您的结果)。我强烈建议您首先找出如何在makefile外部执行此操作,并且只有在成功在makefile外部执行后才能在makefile内部执行此操作。“不工作”是非常模糊的。。。请张贴您尝试的输入/输出。通过快速扫描,您使用了嵌套引号,这可能是您的问题的一部分。@HardcoreHenry请查看编辑您应该在更改前后发布您正在更改的文本(带有预期结果和您的结果)。我强烈建议您首先找出如何在makefile外部执行此操作,并在成功使其在makefile外部工作后才解决如何使其在makefile内部工作的问题。是的,这是正确的。是否建议将代码放在单独的awk脚本中并在Makefile内调用?这有什么不同吗?我已经好几年没有使用makefile了,所以我不记得所有相关的警告。但我确实知道有一些(例如,关于必须加倍
$
s?)。因此,我不知道awk脚本中是否有任何东西需要在makefile中进行特殊处理-如果有,我希望它非常小并且易于处理,但是您可以在makefiles中执行您必须执行的任何操作来处理它,或者将awk脚本存储在一个单独的文件中,并将其作为
awk-f script.awk调用文件
。是的,没错。是否建议将代码放在单独的awk脚本中并在Makefile内调用?这有什么不同吗?我已经好几年没有使用makefile了,所以我不记得所有相关的警告。但我确实知道有一些(例如,关于必须加倍
$
s?)。因此,我不知道awk脚本中是否有任何东西需要在makefile中进行特殊处理-如果有,我希望它非常小并且易于处理,但是您可以在makefiles中执行您必须执行的任何操作来处理它,或者将awk脚本存储在一个单独的文件中,并将其作为
awk-f script.awk调用文件
Initial="# See also"; \
Final="# External links"; \
orig="\.\./(.*)\.md"; \
new="../../Rendered/\1.gen.pdf"; \
file="tempPDF.md"; \
sed -i -r -e "\!$Initial!,\!$Final!s!$orig!$new!g" $file ; \
sed -i '/pattern/i TextToInsert ' inputfile
$ awk '
    f && /^#/ { print "<p><a href=\"#top\" accesskey=\"t\">[Top]</a></p>\n" }
    /^# Introduction/   { f=1 }
    /^# External links/ { f=0 }
    { print }
' file
# Dummy

# Introduction

-

<p><a href="#top" accesskey="t">[Top]</a></p>

# Summary

-

<p><a href="#top" accesskey="t">[Top]</a></p>

### See also

-

<p><a href="#top" accesskey="t">[Top]</a></p>

## References

-

<p><a href="#top" accesskey="t">[Top]</a></p>

# External links

# Dummy
sed -i -e '/^# External links/h;x;/^# Introduction/{x;/^#/i <p><a href="#top" accesskey="t">[Top]</a></p>\n' -e 'x};x;/^# Introduction/h' file