0

私の罪悪感を許してください:

MARC レコードの大きなファイルを検索して置換しようとしています。newline =586で始まるすべての文字列を検索し、行末のピリオドを削除して、その間のデータをそのままにします。

私はかなりの数の順列を試しましたが、どれも機能していないようです。ここで明らかな何かが欠けていると感じています。ヘルプ?!?

4

4 に答える 4

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

mpapec の答えは、変更が 1 つだけであることを最初に知っていれば (それを書くこともできますs/\.$// if /^=586/)、きちんと表現されています。

これは、完全な機能を備えた、1 回限りではなく、何を知らない人でも使用するために書きたいような種類の Perl ではないことに注意してください。やり直しプログラム。そうではなくuse strict、その変数を宣言していません。-w私は旗を渡すことさえしません、そしてそれは手紙だけで済みます!

しかし、Perl は役に立ちたいと思っています。「=586 で始まる任意の行から最後の . を削除したい」という考えがある場合は、上記の 2 番目または 3 番目の例と同じように簡単にこれを行うことができます。MARCモジュールがCPANに存在することを知るために、ここに来て、「ねえ、無題のワンライナーでMARCレコードを変更していて、気分が悪くなってきました...」と言いたいかもしれませんが、CPANにはありません。あなたの仕事を終わらせるワンライナーを思いつくのに苦労する理由.

于 2013-05-25T03:16:53.827 に答える