Sed - вставка мультилинии перед многострочным шаблоном, существующим между двумя шаблонами. - PullRequest
0 голосов
/ 12 сентября 2018

Я пытался использовать 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

Работает следующая подстановка (замена между двумя шаблонами и против шаблона):

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 в sed -i -r -e "\!$Initial!,\!$Final!!^$orig!i $new!g" $file ; \

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Это может сработать для вас (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. Когда флаг установлен, вставьте две строки перед началом любой строки #.

0 голосов
/ 12 сентября 2018

sed для s / old / new, вот и все.Для чего-то еще вы должны использовать awk для простоты, ясности, надежности, переносимости и т. Д.

Это то, что вы пытаетесь сделать (вне make-файла)?

$ 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.

...