0

原谅我的n00bosity:

我正在寻找并替换大型 MARC 记录文件。我想搜索以 newline =586开头的所有字符串,然后删除行尾的句点,使数据保持不变。

我已经尝试了很多排列,但它们似乎都不起作用。我觉得我在这里遗漏了一些明显的东西。帮助?!?

4

4 回答 4

2

虽然在这种情况下正则表达式可能会对您有所帮助,但如果您定期操作 MARC 记录,我建议您使用 CPAN 上的 MARC 处理模块之一。您可以从文件中读取模块,在对象中操作您需要的内容,然后将它们写回。

http://search.cpan.org/dist/MARC-Record/是我在 2001 年写的,至今仍在维护。

您可能还对 perl4lib 感兴趣:http: //perl4lib.perl.org/

于 2013-05-24T14:36:48.353 回答
1

尝试这个

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

我认为这将是命令:

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

注意:我不会说 perl,所以语法可能有点不对

于 2013-05-24T14:10:06.243 回答
1

内联替换,

perl -i -pe '/^ =586/x and s| [.]$||x' file
于 2013-05-24T14:10:33.603 回答
0

我想你尝试构建一个能够理解整行的正则表达式,尽可能精确地匹配它的每个部分,然后未能做到这一点。通常,如果您想对某个文件的某些区别的每一行进行快速更改,只需从以下内容开始:

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 }'

如果你一开始就知道只会有一个变化(你也可以写出来s/\.$// if /^=586/),那么 mapeec 的答案就会很巧妙地表达出来。

请注意,这不是您想用功能齐全、非一次性、甚至可能不知道他们做什么的人使用的 Perl重新做程序。它没有use strict,也没有声明它的变量。我什至不通过-w国旗,而这只需要一封信!

但是 Perl 想要有用。如果您的想法是“我想从以 =586 开头的任何行中删除最后的 .”,那么您可以像上面的第二个或第三个示例一样简单地执行此操作。你可能还想来这里说“嘿,我正在用一百个无标题的单行代码修改 MARC 记录,我开始感觉不好了……”,以了解 CPAN 中存在 MARC 模块,但是没有有任何困难想出完成工作的单行字的理由。

于 2013-05-25T03:16:53.827 回答