Как выполнить подстановку текста во всех файлах в папке? - PullRequest
4 голосов
/ 18 марта 2011

Мне нужно обновить один параметр в большом наборе XML-файлов. Я читаю вокруг и, используя одну строку perl в командной строке Windows, могу заставить его выполнять подстановки файлов за раз, но я изо всех сил пытаюсь заставить perl делать все файлы одновременно.

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" test.xml

Это работает, однако, когда я пытаюсь изменить его на что-то вроде

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml

Я получаю «Не могу открыть * .xml: Неверный аргумент»

perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g;" .xml

Дает мне "Не могу открыть .xml: нет такого файла или каталога"

Я пытался выяснить, могу ли я вызвать его из другого perl-скрипта с помощью system (), однако, это, кажется, вызывает проблемы с использованием кавычек, и, возможно, не лучший способ сделать это.

Резюме:

Проблема - у меня есть большое количество XML-файлов, в которых я хочу изменить один параметр. Я должен быть в состоянии сделать это на компьютере с Windows, и в идеале я хотел бы работать над решением, которое позволило бы мне автоматизировать это в сценарии, чтобы я мог циклически выполнять многочисленные замены значений параметров (с вызовом отдельной программы, которая принимает XML-файлы в качестве входных данных между подстановками).

Спасибо за любую помощь, которую вы можете предложить.

Ответы [ 6 ]

3 голосов
/ 18 марта 2011

Попробуйте это:

для / r% i в (* .xml) do perl -pi.bak -e "s / (\ d +. \ D + E- \ d +) / 2.2E-6 / g;" % Я

3 голосов
/ 18 марта 2011

Вы можете использовать цикл for в скрипте .cmd. Что-то вроде:

for %%a in (*.xml) do (
  perl -i.bak ... %%a
)

Вот удобная cmd.exe ссылка .

3 голосов
/ 18 марта 2011

Когда я делаю что-то подобное, я обычно использую следующий шаблон:

ls *.xml | xargs perl -i.bak -p -e "s/<search>/<replace>/g"

В Windows вы должны использовать следующий шаблон:

for %f in (*.xml) do perl -i.bak -p -e "s/<search>/<replace>/g" "%f"

См. Perl 5 на примере: использование опций -n и -p для получения дополнительной информации.

1 голос
/ 18 марта 2011

Проблема заключается в том, что извинение Windows для оболочки не выполняет подстановку имен файлов (расширение * .xml во все файлы с расширением .xml).

Поскольку оболочка не сделает это за вас, вы должны сделать это сами.

Это легко сделать в Perl, но это нужно сделать до запуска "внутреннего" кода, поэтому поместите его в блок BEGIN:

perl -pi.bak -e "BEGIN{@ARGV=glob shift} s/(\d+\.\d+E-\d+)/2.2E-6/g;" *.xml
1 голос
/ 18 марта 2011

use File::Find;

ОБНОВЛЕНИЕ: вы можете использовать этот однострочник:

perl -we 'use File::Find; my $dir = shift; find (sub { $_=~ /\.xml$/i and system @ARGV, $_ }, $dir)' <dir> <other-one-liner>

0 голосов
/ 18 марта 2011

find . -type f -name *.xml | xargs perl -pi.bak -e "s/(\d+\.\d+E-\d+)/2.2E-6/g; "

это передаст все файлы ниже. (рекурсивно) сопоставление .xml с командой perl, по одному за раз.

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