我尝试使用sed
在$new
和$orig
之间的$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 ; \
^
,以便模式从位置0开始输入文件:
# Dummy
# Introduction
-
# Summary
-
### See also
-
## References
-
# External links
# Dummy
预期的输出文件:
# 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
以下替换有效(在2个模式之间替换为一个模式):
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
所以我把这两个结合在一起。
我认为问题在于orig="\\n#(.*)\\n"; \
和sed -i -r -e "\!$Initial!,\!$Final!!^$orig!i $new!g" $file ; \
中sed的语法
答案 0 :(得分:1)
sed用于s / old / new,仅此而已。对于其他任何事情,您都应该使用awk来实现简单性,清晰度,鲁棒性,可移植性等。
这是您想要做的(在makefile之外)吗?
$ 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
如果要“就地编辑”,可以将awk -i inplace ...
与GNU awk一起使用,就像可以将sed -i ...
与GNU sed一起使用。
答案 1 :(得分:1)
这可能对您有用(GNU sed):
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
使用保留空间(附加缓冲区)来标记何时插入所需的行。遇到# Introduction
时将标志设置为打开,而# External links
时将标志设置为关闭。当该标志处于启用状态时,在#
开头的任何行之前插入两行。