簡體   English   中英

使用 Perl 從文件中刪除字符串

[英]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匹配abcac 請注意. 也是一個元字符,也應該被轉義,但現在你陷入了兔子洞。 最好這樣做:

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::LibXMLXML::TwigMojo::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM