Многострочная замена в оболочке

Многострочная замена в оболочке

У меня есть следующие фрагменты текста в текстовом файле:

* Exported from Foo *

Title and Section

и другой

* Exported from Foo *

Other Title and Other Section

Мне нужно заменить это на

# Title and Section

и

# Other Title and Other Section

Теперь я могу сделать это с помощью:

echo "$(grep -A 2 "Exported from Foo" ../tmp/data/${nospacefile} | grep -v "Exported from Foo" | grep -v -- -- | tr -d '\r' | grep -v -e '^[[:space:]]*$' | sed -e 's/^[ \t]*//')" | while read -r title; do sed -i -e "s/^\([[:blank:]]*\)$title/\# $title/g" ../tmp/data/${nospacefile}; done

Однако строка "Заголовок и раздел" или "Другой заголовок и другой раздел" также появляется в местах, которые я не хочу заменять. Я хочу, чтобы она заменяла только те места, которые появляются после строки Exported и пустой строки.

Какая лучшая конструкция оболочки мне доступна для этого? Я более чем счастлив отправить stdout в perl, python, что угодно.

решение1

Вы можете попробовать ed(1), это редактирование третьей строки, начиная с * Exported from Foo *независимо от того, пуста вторая строка или нет.

Чтобы просто вывести вывод как stdoutв sed

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' ,p Q | ed -s file.txt 

Это просто выводит вывод в stdout, чтобы редактировать файл на месте.

printf '%s\n' 'g/^\* Exported from Foo \*$/+2s/^/# /' w | ed -s file.txt 

Чтобы использовать edскрипт, который просто выводит вывод на экранstdout

cat script.ed

Выход

g/^\* Exported from Foo \*$/+2s/^/# /
,p
Q

Скрипт, который редактирует файлin-place

g/^\* Exported from Foo \*$/+2s/^/# /
w
q

Теперь вы можете сделать

ed -s file.txt < script.ed

Связанный контент