原谅我的无聊:
我希望在大型MARC记录文件上进行查找和替换。我想搜索以换行符 = 586 开头的所有字符串,然后删除该行末尾的句点,保持数据完好无损。
我尝试了很多排列,但似乎都没有。我觉得我在这里遗漏了一些明显的东西。帮助?!?
答案 0 :(得分:2)
虽然在这种情况下正则表达式可能对您有所帮助,但如果您定期操作MARC记录,我建议您在CPAN上使用其中一个MARC处理模块。您可以从文件中读取模块,操作对象中需要的内容,然后将其写回。
http://search.cpan.org/dist/MARC-Record/是我在2001年写的,今天仍在维护。
您可能也对perl4lib感兴趣:http://perl4lib.perl.org/
答案 1 :(得分:1)
试试这个
Search: (^=586.*)\.$
Replace: \1
我认为这将是命令:
/(^=586.*)\.$/\1/
注意:我不会说perl,所以语法可能稍微偏离
答案 2 :(得分:1)
内联替换,
perl -i -pe '/^ =586/x and s| [.]$||x' file
答案 3 :(得分: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
标志并找到{{1}中的列} array:
@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的答案就会得到很好的表达。
请注意,这不是那种你想用功能齐全的,不是一次性的,用于使用的甚至是人们可能不知道什么的Perl。 - 他们正在做的计划。它没有s/\.$// if /^=586/
,也没有声明它的变量。我甚至没有通过use strict
标志,只花了一封信!
但Perl想要有用。如果您的想法是“我想从= 586开头的任何行中移除最终版本”,那么您可以像上面第二个或第三个示例中那样简单地执行此操作。你可能仍然想来这里说“嘿,我正在用一百个无标题的单行修改MARC记录而我开始感觉不好......”,要知道在CPAN中存在MARC模块,但是没有有理由想出完成工作的单线工作。