Проблема, которую я имею, довольно проста (или так кажется).Все, что я хочу сделать, это заменить абзац текста (это комментарий заголовка) другим абзацем.Это должно произойти в разных файлах в иерархии каталогов (дерево исходного кода).
Заменяемый абзац должен совпадать во всей полноте, поскольку существуют подобные текстовые блоки.
например
Заменить
// ----------
// header
// comment
// to be replaced
// ----------
на
// **********
// some replacement
// text
// that could have any
// format
// **********
Я смотрел на использование sed ииз того, что я могу сказать, наибольшее количество строк, над которыми он может работать, - 2 (с командой N).
Мой вопрос: как это сделать из командной строки linux?
РЕДАКТИРОВАТЬ:
Полученное решение: Лучшее решение было Ikegami, полностью командной строки и наилучшим образом подходит для того, что я хотел сделать.
Мое окончательное решение потребовало некоторой настройки;входные данные содержали много специальных символов, как и данные замены.Чтобы справиться с этим, необходимо предварительно обработать данные, чтобы вставить соответствующие символы \ n и escape-символы.Конечным продуктом является сценарий оболочки, который принимает 3 аргумента;Файл, содержащий текст для поиска, Файл, содержащий текст для замены и папку для рекурсивного анализа файлов с расширением .cc и .h.Это довольно легко настроить здесь.
SCRIPT:
#!/bin/bash
if [ -z $1 ]; then
echo 'First parameter is a path to a file that contains the excerpt to be replaced, this must be supplied'
exit 1
fi
if [ -z $2 ]; then
echo 'Second parameter is a path to a file contaiing the text to replace with, this must be supplied'
exit 1
fi
if [ -z $3 ]; then
echo 'Third parameter is the path to the folder to recursively parse and replace in'
exit 1
fi
sed 's!\([]()|\*\$\/&[]\)!\\\1!g' $1 > temp.out
sed ':a;N;$!ba;s/\n/\\n/g' temp.out > final.out
searchString=`cat final.out`
sed 's!\([]|\[]\)!\\\1!g' $2 > replace.out
replaceString=`cat replace.out`
find $3 -regex ".*\.\(cc\|h\)" -execdir perl -i -0777pe "s{$searchString}{$replaceString}" {} +