原谅我的无礼:
我正在寻找做一个查找和替换上的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/
),则mpapec的答案将得到简洁的表达。
请注意,这不是那种您希望在一个功能齐全、不是一次性的、甚至供那些可能不知道自己在做什么的人使用的程序中编写的Perl。它没有use strict
,也没有声明它的变量。我甚至没有通过-w
的旗帜,这只花了一个字母!
但是Perl想要有用。如果你的想法是"我想取消期末考试。"从任何以"=586"开头的行开始,您都可以像上面的第二个或第三个示例一样简单地执行此操作。您可能仍然想来到这里说"嘿,我正在用100个未命名的一行程序修改MARC记录,我开始感觉很糟糕……",以了解MARC模块在CPAN中存在,但是没有理由在提出完成工作的一行程序时遇到任何困难。