Удаление завершающего периода из строки в файле данных MARC в Perl

Прости мой n00bosity:

Я ищу, чтобы найти и заменить большой файл записей MARC. Я хочу найти все строки, начинающиеся с символа новой строки =586, а затем удалить точку в конце строки, сохраняя данные между ними нетронутыми.

Я попробовал довольно много перестановок, и ни одна из них, казалось, не работала. Я чувствую, что упускаю что-то очевидное здесь. Помогите?!?

4 ответа

Решение

Попробуй это

Search: (^=586.*)\.$
Replace: \1

Я думаю, что это будет команда:

/(^=586.*)\.$/\1/

Примечание: я не говорю на Perl, поэтому синтаксис может быть немного

Хотя регулярное выражение может помочь вам в этом случае, если вы регулярно манипулируете записями MARC, я предлагаю вам использовать один из модулей обработки MARC в CPAN. Вы можете читать свои модули из файла, манипулировать тем, что вам нужно в объектах, а затем записывать их обратно.

http://search.cpan.org/dist/MARC-Record/ - это то, что я написал в 2001 году и до сих пор поддерживается.

Вы также можете быть заинтересованы в perl4lib: http://perl4lib.perl.org/

Встроенная замена,

perl -i -pe '/^ =586/x and s| [.]$||x' file

Я полагаю, что вы попытались создать регулярное выражение, которое бы понимало всю строку, как можно точнее сопоставляя каждую ее часть, а затем не смогли сделать это правильно. В общем, если вы хотите выполнить быстрое изменение в каждой строке с некоторыми отличиями от какого-либо файла, просто начните с:

perl -pe 'if (distinctive) { changes }' oldfile > newfile

Итак, в этом случае:

perl -pe 'if (/^=586/) { s/\.$// }' oldfile > newfile

Или же:

# saves original in thefile.bak
perl -i.bak -pe 'if (/^=586/) { s/\.$// }' thefile

Если то, что является отличительным в этой строке, относится к отличительному столбцу (при отсутствии отсутствующих столбцов), передайте -a пометить и найти столбцы в @F массив:

# censor 4k-sized files
ls -l|perl -ape 'if ($F[4] == 4096) { s/./-/g }'

Если вы не хотите изменять файл, а просто получить от него некоторую информацию, -n и окончательная обработка в BEGIN Блок может привести вас довольно далеко:

# sum file sizes
ls -l|perl -lane 'next if /^d/; $bytes += $F[4]; END { print $bytes }'

# print unique owners of files in this directory, preceded by the
# number of occurrences of the owner
ls -l|perl -lane '$users{$F[2]}++; END { print "$users{$_} $_" for keys %users }'

Ответ mpapec четко выражен, если вы с самого начала знаете, что будет только одно изменение (вы также можете написать его s/\.$// if /^=586/).

Обратите внимание, что это не тот Perl, который вы хотели бы написать в полнофункциональном, а не единственном в своем роде, предназначенном для использования даже людьми, которые могут не знать, что они повторная программа. Это не use strictи он не объявляет свои переменные. Я даже не передаю -w флаг, и это стоит только письмо!

Но Perl хочет быть полезным. Если ваша мысль "Я хочу удалить финал. Из любой строки, начинающейся с =586", то вы можете сделать это так же просто, как во втором или третьем примере выше. Вы все еще можете прийти сюда и сказать "эй, я изменяю записи MARC с помощью сотни безымянных однострочников, и я начинаю чувствовать себя плохо...", чтобы узнать, что модули CPC существуют в CPAN, но нет Причиной для каких-либо трудностей придумать однострочники, которые сделают вашу работу.

Другие вопросы по тегам