Команда Windows для обнаружения и удаления текста в файле

У меня есть файл ascii, и где-то там есть строка: BEGIN, а затем строка: 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

Тем не менее, переводы строк все еще являются проблемой.


person DarkwingDuck    schedule 09.01.2009    source источник
comment
Если ответы на предыдущий вопрос вас не удовлетворили, так и скажите. Этот новый вопрос эквивалентен. stackoverflow .com/questions/425864/   -  person Rob Kennedy    schedule 09.01.2009
comment
Любые другие идеи о проблеме с переводом строки? Возможно, это из-за канала к новому файлу: › новый файл, мне нужно, чтобы он передавал каждую строку, включая символ новой строки   -  person DarkwingDuck    schedule 09.01.2009


Ответы (3)


С другой стороны, то, что я использую в эти дни, — это язык сценариев, который прекрасно работает с окнами, такими как 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.

person danieltalsky    schedule 09.01.2009

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

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

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

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

person j_random_hacker    schedule 09.01.2009

Вот как удалить весь раздел 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);
person deadlydog    schedule 30.09.2011