Удаление многострочного текста из нескольких файлов - PullRequest
3 голосов
/ 06 октября 2008

У меня есть куча java-файлов, из которых я хочу удалить строки javadoc с лицензией [изменяю это в своем коде].

Шаблон, который я ищу, это

^\* \* ProjectName .* USA\.$

но совпадает между строк

Есть ли способ, которым sed [или широко используемый редактор в Windows / Linux] может выполнять поиск / замену многострочного шаблона?

Ответы [ 3 ]

3 голосов
/ 06 октября 2008

Вот подходящая контрольная точка в моем любимом уроке sed.

0 голосов
/ 10 октября 2014

Возможно, кто-то все еще время от времени ищет такое решение. Вот один.

Используйте awk, чтобы найти строки, которые нужно удалить. Затем с помощью diff удалите строки и дайте sed убраться.

awk "/^\* \* ProjectName /,/ USA\.$/" input.txt \
  | diff - input.txt \
  | sed -n -e"s/^> //p" \
  >output.txt

Предупреждение: если первый шаблон существует, а второй - нет, вы потеряете весь текст под первым шаблоном - проверьте это сначала.

0 голосов
/ 06 октября 2008

Да. Вы используете sed, awk, perl или что-то еще для решения этой проблемы?

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

Вот пример:

/\*(?:.|[\r\n])*?\*/
perl -0777ne 'print m!/\*(?:.|[\r\n])*?\*/!g;' <file>

Распечатывает все комментарии все вместе. (?: Запись должна быть используется для захвата скобок. / не нужно избегать, потому что! Разграничивает выражение. -0777 используется включить режим slurp и -n включает автоматическое чтение.

(От: http://ostermiller.org/findcomment.html)

...