Sed-在2种模式之间存在的多线模式之前插入多行

时间:2018-09-12 12:47:22

标签: awk sed insert pattern-matching

我尝试使用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的语法

2 个答案:

答案 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时将标志设置为关闭。当该标志处于启用状态时,在#开头的任何行之前插入两行。