В Perl существует традиция редактирования на месте, основанная на философии Unix.
Мы могли бы, например, написать простую команду add-row-by-num.pl следующим образом:
#!/usr/bin/perl -pi
BEGIN { $ln=shift; $line=shift; }
print "$line\n" if $ln==$.;
close ARGV if eof;
Замените третью строку на $_="$line\n" if $ln==$.;
, чтобы заменить строки.Исключите $line=shift;
и замените третью строку на $_ = "" if $ln==$.;
, чтобы удалить строки.
Мы могли бы написать простую команду add-row-by-regex.pl следующим образом:
#!/usr/bin/perl -pi
BEGIN { $regex=shift; $line=shift; }
print "$line\n" if /$regex/;
Или просто команда perl perl -pi -e 'print "LINE\n" if /REGEX/'; FILES
.Опять же, мы можем заменить print $line
на $_="$line\n"
или $_ = ""
для замены или удаления соответственно.
Нам больше не нужна строка close ARGV if eof;
, потому что нам не нужен счетчик $.
после обработки каждого файла.
Есть ли какая-то причина, по которой обычной утилиты unix grep
не хватает?Вспомните, регулярное выражение (PATERN){n}
соответствует PATERN
ровно n раз, т. Е. (\s*\S+\s*,){6}{\s*777\s*,)
требует 777 в 7-м столбце.
Существует даже регулярное выражение perl для преобразования ваших пар fieldN=value
в этот регулярныйвыражение, хотя я бы сам использовал split
, map
и join
.
Кстати, File :: Inplace обеспечивает редактирование на месте для файловых дескрипторов.