原谅我的n00bosity:
我正在寻找并替换大型 MARC 记录文件。我想搜索以 newline =586开头的所有字符串,然后删除行尾的句点,使数据保持不变。
我已经尝试了很多排列,但它们似乎都不起作用。我觉得我在这里遗漏了一些明显的东西。帮助?!?
虽然在这种情况下正则表达式可能会对您有所帮助,但如果您定期操作 MARC 记录,我建议您使用 CPAN 上的 MARC 处理模块之一。您可以从文件中读取模块,在对象中操作您需要的内容,然后将它们写回。
http://search.cpan.org/dist/MARC-Record/是我在 2001 年写的,至今仍在维护。
您可能还对 perl4lib 感兴趣:http: //perl4lib.perl.org/
尝试这个
Search: (^=586.*)\.$
Replace: \1
我认为这将是命令:
/(^=586.*)\.$/\1/
注意:我不会说 perl,所以语法可能有点不对
内联替换,
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 }'
如果你一开始就知道只会有一个变化(你也可以写出来s/\.$// if /^=586/
),那么 mapeec 的答案就会很巧妙地表达出来。
请注意,这不是您想用功能齐全、非一次性、甚至可能不知道他们做什么的人使用的 Perl重新做程序。它没有use strict
,也没有声明它的变量。我什至不通过-w
国旗,而这只需要一封信!
但是 Perl 想要有用。如果您的想法是“我想从以 =586 开头的任何行中删除最后的 .”,那么您可以像上面的第二个或第三个示例一样简单地执行此操作。你可能还想来这里说“嘿,我正在用一百个无标题的单行代码修改 MARC 记录,我开始感觉不好了……”,以了解 CPAN 中存在 MARC 模块,但是没有有任何困难想出完成工作的单行字的理由。