язык сценариев для удаления преамбулы лицензии на файлы - PullRequest
0 голосов
/ 07 декабря 2011

Я хочу рекурсивно заменить «бла-бла-бла» в моем лицензионном регионе ни на что:

#region License
blah blah blah
blah blah blah
#endregion

следует заменить на

#region License
#endregion

Это должно относиться ко всеммои .cs файлы в определенной директории (рекурсивные).Я попробовал это с помощью sed, но так как я нахожусь на окнах, у меня были некоторые проблемы с окончаниями строк.Как я могу сделать это с Perl (или Python), или что-то родное для Windows?

РЕДАКТИРОВАТЬ: вот решение, которое я придумал, спасибо всем здесь!:

#/bin/bash
list=`find . -name '*.cs' -o -name '*.h' -o -name '*.cpp'` 
for i in $list 
do
perl -i~ -ne 'if (/#region License/../#endregion/) {print if /#(?:end)?  region/;next};print' $i 
done

Ответы [ 7 ]

6 голосов
/ 07 декабря 2011

Как то так?

perl -i~ -pe 'undef $_ if /^#region License$/ .. /^#endregion$/'
1 голос
/ 07 декабря 2011

ex (vim -e) может быть, это хороший выбор.

echo -e 'g/^#region License$/+1,/^#endregion$/-1d\nx' | ex program.cs

  • g/.../+1,/.../-1 => найти строки между регулярными выражениями (+1 => на одну строку ниже, -1 => на одну строку выше)
  • d => удалить
  • \n => Введите
  • x => сохранить и выйти

В Windows, пожалуйста, используйте:

vim -c "g/^#region License/+1,/^#endregion/-1d" +x program.cs
1 голос
/ 07 декабря 2011
perl -ne 'if (/#region/../#endregion/) {print if /#(?:end)?region/;next};print' file

... которые оставляют строки "#region license" и "#endregion" в выводе по запросу.

1 голос
/ 07 декабря 2011
#!/usr/bin/env python

with open('input') as fd:
    text=fd.read()

old="""#region License
blah blah blah
blah blah blah
#endregion

"""

new="""#region License
#endregion

"""

print text.replace(old,new)

добавить немного os.walk для обхода каталога и либо записать результат в стандартный вывод, либо заменить исходный файл новым содержимым. Смотрите, например https://stackoverflow.com/a/5421671/297323

0 голосов
/ 07 декабря 2011

Я бы сделал что-то вроде этого:

perl -i.orig -0777 -p -e 's/#region License.*?#endregion/#region License\n#endregion/s' test.cc
  • -0777 означает, что весь файл будет удален
  • -p делает код -e окруженнымнекоторое время (<>) {... print $ _} block
  • -i.orig выполняет редактирование на месте и создает резервный флаг
  • s в конце подстановки.. * в регулярном выражении соответствует eol

Используйте find, чтобы определить, какие файлы обрабатывать

0 голосов
/ 07 декабря 2011

python, если все органы лицензирования различаются по всем непредсказуемым причинам:

#!/usr/bin/env python

with open('input') as fd:
    text=fd.read()

try:
    start, rest = text.split("#region License\n", 1)
    middle, end = rest.split("#endregion\n", 1)
    print "%s\#region License\n#endregion\n%s" % (start, end)
except ValueError:
    # didn't contain a properly formatted license:
    print text
0 голосов
/ 07 декабря 2011

читать строки файла, проходить через каждую строку, если строка начинается с #region, начинать пропускать следующие строки, если строки заканчиваются #endregion, снова начинать собирать строки, выводить последнюю строку в файл, например,

def filter_lines(lines):
    newlines = []
    startmarker = '#region'
    endmarker = '#endregion'
    skip = False
    for line in lines:

        if line.startswith(startmarker):
            newlines.append(line)
            skip = True
            continue
        if line.endswith(endmarker):
            skip = False

        if not skip: newlines.append(line)

    return newli

NES

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...