Вот (в основном) эквивалентный Perl-скрипт для oneliner perl -p -i -e 's/\n\n/\n/g' *.xml
(главное отличие состоит в том, что для него включены strict
и warnings
, что настоятельно рекомендуется ), который можно расширить, добавив больше кода для изменения текущей строки в теле цикла while
.
#!/usr/bin/env perl
use warnings;
use strict;
if (!@ARGV) { # if no files on command line
@ARGV = glob('*.xml'); # get a default list of files
}
local $^I = ''; # enable inplace editing (like perl -i)
while (<>) { # read each line of each file into $_
s/\n\n/\n/g; # modify $_ with a regex
# more regexes here...
print; # write the line $_ back out
}
Вы можете сохранить этот скрипт в файле, таком как process.pl
, а затем запустить его с помощью perl process.pl
или выполнить chmod u+x process.pl
, а затем запустить его с помощью ./process.pl
.
С другой стороны, вы действительно не должны изменять файлы XML с помощью регулярных выражений , существует множество модулей Perl для обработки XML - я писал об этом еще здесь, Кроме того, в примере, который вы показали, s/\n\n/\n/g
фактически не будет иметь никакого эффекта, так как при построчном чтении файлов ни одна строка не будет содержать два \n
(вы можете изменить способ чтения файлов Perl, но я не вижу упоминания об этом в вопросе).
Редактировать: Вы назвали сценарий в своем примере unicode.sh
- если вы обрабатываете файлы Unicode, то Perl имеет очень мощные функции, чтобы помочь с этим, хотя код не обязательно в конечном итоге так же красиво и коротко, как я показал выше Вам нужно будет рассказать нам больше о том, что вы делаете, и показать несколько примеров ввода и вывода, чтобы получить предложения по этому поводу. Смотрите также, например, perlunitut
.