[英]Removing a string from a file using Perl
我有一個文件,每當它出現在文件中時,我都需要刪除它。 該文件包含以下文本(示例):
<RECORD><JOSE><?xml version="1.0" encoding="UTF-8" standalone="no" ?><JUAN><ISMAEL><?xml version="1.0" encoding="UTF-8" standalone="no" ?></ISMAEL><NEWFILE><?xml version="1.0" encoding="UTF-8" standalone="no" ?></NEWFILE></RECORD>
每次它出現在文件中時,我都需要刪除它。
要刪除的字符串: <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
我這周開始使用 Perl,但我還有很多東西要學。 這是我到目前為止的代碼,但不起作用。
use strict;
use warnings;
my $dir = path('D:\Programs\PERL\perl_tests'); # /dir
my $file = $dir->child("tobeclean.txt"); # /file.txt
open(REMFILE,"<",$file) || die "couldn't open $file: $!\n";
while (<REMFILE>) {
s{<?xml version="1.0" encoding="UTF-8" standalone="no" ?>}{};
print;
}
close(REMFILE);
?
是一個元字符。 如果你只是逃避它,你應該工作:
s{<\?xml version="1.0" encoding="UTF-8" standalone="no" \?>}{};
未逃脫, ?
表示前一個原子可能存在也可能不存在,因此ab?c
匹配abc
或ac
。 請注意.
也是一個元字符,也應該被轉義,但現在你陷入了兔子洞。 最好這樣做:
my $k=quotemeta(q/<?xml version="1.0" encoding="UTF-8" standalone="no" ?>/);
s{$k}{};
或類似的,以確保你得到你想要的。 或使用以下內容搜索固定字符串:
s{\Q<?xml version="1.0" encoding="UTF-8" standalone="no" ?>\E}{}'
您嘗試的正則表達式失敗,因為?
是一個元字符——它在正則表達式模式中具有特殊含義(它限制了前一個匹配),如前所述。 所以你逃脫它,一切都很好。
但是,如果該短語分布在文件中的多行上怎么辦? 然后逐行讀取文件永遠無法在一個正則表達式中找到整個內容。 我們是否絕對確定該短語總是完全在一行上?
為了安全起見,我建議將文件讀入字符串(“slurp”)。 但是,如果確實超過多行,則短語內部可能會有換行符,因此請使用更通用的模式。
use warnings;
use strict;
use feature 'say';
use Path::Tiny;
my $file = shift // die "Usage: $0 file\n";
my $text = path($file)->slurp;
$text =~ s{<\?xml [^>]* >}{}xg;
say $text;
我使用Path::Tiny
因為這個問題很明顯(即使use
語句本身被遺漏了!)
但真的,這個文件是任何一種正確的格式嗎? 一個 XML? (您正在刪除 XML 文檔“序言”。)如果是這樣,最好使用庫來閱讀它。
值得一提的一些好的庫: XML::LibXML
、 XML::Twig
、 Mojo::DOM
。
Perl 使遍歷文件和修改其內容變得容易。 您可以從命令行執行此操作。
perl -ipe's/\Q<?xml version="1.0" encoding="UTF-8" standalone="no" ?>//g' file.xml
這假定此字符串始終位於單行且不跨行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.