簡體   English   中英

Perl腳本將單詞從一個文件刪除到輸出文件

[英]Perl Script removing words from one file to an output file

我很確定這是真的。 但是我不了解Perl,只需要使用一次即可。 因此,感謝您的耐心配合。

我試圖從下面的HTML中的一行中刪除不需要的文本:

    <a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a> 

我只想剩下的就是Run Printable TCI List (<i>Revised</i>) ,它是</a>前面的文本。 我大約有500行,由於將來可能會更改它們,因此創建程序很有意義。 以下是到目前為止的我的Perl代碼:

open (SEARK, 'C:\\HTMLsorter\\sources.txt');
open (OUTSEARK, '>C:\\HTMLsorter\\outseark.txt');
while(<SEARK>) {
  chomp;

  if ($_=~/<a target/) {
    $_ =~ s/\<i>//g;
    $_ =~ s/\<\/i>//g;
    @itemsa = split(/>/);
    @itemsb = split(/</, $itemsa[1]);
    print OUTSEARK ("$itemsb[0]\n");
  }
}
close (SEARK);
close (OUTSEARK);

我確定您可以閱讀,但只是為了說明我正在打開一個名為sources.txt的文件,其中有500行需要排序。 輸出文件將是outseark.txt 到目前為止,它將輸出以下內容:

Run Printable TCI List (Revised)

顯然,這是由於針對箭頭中及其周圍的所有內容進行了拆分。 有什么想法可以將斜體放在方括號內嗎? 與:

Run Printable TCI List (<i>Revised<i>)

感謝您的光臨。

#!/usr/bin/perl
use strict;
use warnings;

open IFH, '<myfile.txt';
open OFH, '>output.txt';

while (<IFH>) {
  if (/<a\s+target.*?>(.*?)<\/a>/i)
  {
    $_ = $1;
    s/<.*?>//g;
    print OFH "$_\n";
  }
}

close IFH;
close OFH;

您可以在一個襯里中執行此操作。

cat inputfile|perl -ne 'if (s#<a\s+target[^>]+>(.+?)</a>##is){print "$1\n";}'>outputfile

這是工作:

echo '<a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a>
<a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 1(<i>Revised<i>)</a>
<a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 2(<i>Revised<i>)</a>
<a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List 3(<i>Revised<i>)</a>'|\
perl -ne 'if (s#<a\s+target[^>]+>(.+?)</a>##is){print "$1\n";}'

Run Printable TCI List (<i>Revised<i>)
Run Printable TCI List 1(<i>Revised<i>)
Run Printable TCI List 2(<i>Revised<i>)
Run Printable TCI List 3(<i>Revised<i>)

您應該使用適當的HTML解析器,例如HTML::TreeBuilder 該程序演示的代碼不再復雜

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_file(*DATA);

print $_->as_text, "\n" for $tree->look_down(_tag => 'a', target => qr/./);

__DATA__
    <a target="_blank"          href="http://sharepoint/sites/cerner/quickreferenceguides/Documents/EXP001_Run_Printable_TCI_List.pdf" onmouseover="return overlib('This guide outlines the process for running a printable TCI List', CAPTION, 'TCI LIST');" onmouseout="return nd();">Run Printable TCI List (<i>Revised<i>)</a> 

輸出

Run Printable TCI List (Revised)

編輯

要對示例中的文件使用此技術,代碼如下所示

use strict;
use warnings;

use HTML::TreeBuilder;

my $tree = HTML::TreeBuilder->new_from_file('C:\HTMLsorter\sources.txt');

open my $out, '>', 'C:\HTMLsorter\outseark.txt' or die $!;

print $out $_->as_text, "\n" for $tree->look_down(_tag => 'a', target => qr/./);

編輯2

現在,我更好地了解了您的需求,我可以提供這種替代解決方案。 它使用HTML::DOM模塊來訪問HTML文檔的文檔對象模型 ,因為使用HTML::TreeBuilder獲得所需的結果相對困難。

我還注意到您的示例HTML包含<i>Revised<i> ,顯然應該將其<i>Revised</i> ,並且我已針對此示例測試對其進行了更正。 無論如何,Perl都試圖像瀏覽器一樣解析錯誤的HTML,即使出現錯誤,輸出還是可用的。

use strict;
use warnings;

use HTML::DOM;

my $dom = HTML::DOM->new;
$dom->parse_file('C:\HTMLsorter\sources.txt') or die $!;

open my $out, '>', 'C:\HTMLsorter\outseark.txt' or die $!;
print $out $_->innerHTML, "\n" for grep $_->attr('target'), $dom->getElementsByTagName('a');

輸出

(已更正標簽)

Run Printable TCI List (<i>Revised</i>)

(帶有原始標簽)

Run Printable TCI List (<i>Revised<i>)</i></i>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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