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