Команда Windows для обнаружения и удаления текста в файле - PullRequest
2 голосов
/ 09 января 2009

У меня есть файл ascii и там где-то есть строка: НАЧАТЬ и позже на линии: END

Я бы хотел иметь возможность удалить эти две строки и все, что находится между ними, из вызова командной строки в Windows. Это должно быть полностью автоматизировано.

РЕДАКТИРОВАТЬ: См. sed в Vista - как удалить все символы между? для получения подробной информации о том, как использовать sed для этого (cygwin имеет sed).

РЕДАКТИРОВАТЬ: я обнаружил, что SED может работать, но когда я направить вывод в файл, возврат каретки были удалены. Как я могу сохранить это? Используя это регулярное выражение sed:

/ ^ GlobalSection (TeamFoundationVersionControl) = preSolution $ /, / ^ EndGlobalSection $ / { / ^ GlobalSection (TeamFoundationVersionControl) = preSolution $ /! { / ^ EndGlobalSection $ /! D } }

.. где начальный раздел - «GlobalSection (TeamFoundationVersionControl) = preSolution», а конечный раздел - «EndGlobalSection». Я также хотел бы удалить эти строки.

РЕДАКТИРОВАТЬ: я сейчас использую что-то более простое для sed:

/ ^ GlobalSection (TeamFoundationVersionControl) = preSolution $ /, / ^ EndGlobalSection $ / d

Перевод строки все еще остается проблемой, хотя

Ответы [ 3 ]

1 голос
/ 09 января 2009

Вот 1-строчная команда Perl, которая делает то, что вы хотите (просто введите ее в окне командной строки):

perl -i.bak -ne "print unless /^BEGIN\r?\n/ .. /^END\r?\n/" myfile.txt

Возврат каретки и перевод строки будут сохранены должным образом. Исходная версия myfile.txt будет сохранена как myfile.txt.bak.

Если у вас не установлен Perl, получите ActivePerl .

1 голос
/ 09 января 2009

В качестве альтернативы я использую в настоящее время язык сценариев, который прекрасно подходит для таких задач, как Ruby или Python. Ruby легко установить в Windows и создает такие проблемы, как детская игра.

Вот скрипт, который вы можете использовать как: cutBeginEnd.rb myFileName.txt

sourcefile = File.open(ARGV[0])

# Get the string and do a multiline replace
fileString = sourceFile.read()
slicedString = fileString.gsub(/BEGIN.*END\n/m,"") 

#Overwrite the file
sourcefile.pos = 0                
sourcefile.print slicedString             
sourcefile.truncate(f.pos)  

Это делает довольно хорошую работу, обеспечивает большую гибкость и, возможно, более читабельно, чем sed.

0 голосов
/ 30 сентября 2011

Вот как удалить весь раздел GlobalSection (TeamFoundationVersionControl) = preSolution с использованием регулярного выражения C #:

// Create a regex to match against an entire GlobalSection(TeamFoundationVersionControl) section so that it can be removed (including preceding and trailing whitespace).
// The symbols *, +, and ? are greedy by default and will match everything until the LAST occurrence of EndGlobalSection, so we must use their non-greedy counterparts, *?, +?, and ??.
// Example of string to match against: "    GlobalSection(TeamFoundationVersionControl) ...... EndGlobalSection     "
Regex _regex = new Regex(@"(?i:\s*?GlobalSection\(TeamFoundationVersionControl\)(?:.|\n)*?EndGlobalSection\s*?)", RegexOptions.Compiled);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...