У меня есть следующие фрагменты текста в текстовом файле:
* 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