Заменить весь абзац другим из командной строки linux

Проблема, с которой я столкнулся, довольно проста (по крайней мере, так кажется). Все, что я хочу сделать, это заменить абзац текста (это комментарий заголовка) другим абзацем. Это должно происходить в разном количестве файлов в иерархии каталогов (дерево исходного кода).

Заменяемый абзац должен совпадать полностью, поскольку существуют аналогичные текстовые блоки.

например.

Для замены

// ----------
// header
// comment
// to be replaced
// ----------

на

// **********
// some replacement
// text
// that could have any
// format
// **********

Я рассмотрел использование sed и, насколько я могу судить, наибольшее количество строк, с которыми он может работать, равно 2 (с помощью команды N).

Мой вопрос: как это можно сделать из командной строки Linux?

РЕДАКТИРОВАТЬ:

Полученное решение: Лучшее решение было от Ikegami, полностью из командной строки и лучше всего подходило для того, что я хотел сделать.

Мое окончательное решение потребовало некоторой настройки; входные данные содержали много специальных символов, как и данные замены. Чтобы справиться с этим, данные необходимо предварительно обработать, чтобы вставить соответствующие символы \ n и escape-символы. Конечный продукт - это сценарий оболочки, который принимает 3 аргумента; Файл, содержащий текст для поиска, файл, содержащий текст для замены, и папку для рекурсивного анализа файлов с расширениями .cc и .h. Здесь довольно легко настроить.

СКРИПТ:

#!/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}" {} +
5
задан radman 2 November 2011 в 05:59
поделиться