Удаление завершающего периода из строки в файле данных 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, но нет Причиной для каких-либо трудностей придумать однострочники, которые сделают вашу работу.