2015-09-24 118 views
0

我想解析一些源文件,並堅持這個問題。我正在尋找匹配一個特殊的字符串,其中有「< <」和「>>>」,我試圖從找到上述符號開始直到它遇到第一個「;」開始刪除所有換行符。符號。任何幫助都感激不盡。Perl從匹配的字符串中刪除換行符

這就是我要做的:

輸入:

... lines of code 
func1 <<< abc, xyz >>> (str1, 
         str2, 
         str3); 
... lines of code 

輸出:

... lines of code 
func1 <<< abc, xyz >>> (str1, str2, str3); 
... lines of code 

變量FUNC1,ABC,XYZ,STR1,STR2,STR3都可以變化。

在此先感謝。

編輯:

這是我曾嘗試和迄今爲止只打印相同的模式作爲輸入。

while (<$fh>) { 
    if (/\<\<\<.*\>\>\>/) { 
    while ($_ !~ /\)\s*\;/) { 
      chomp $_; 
      $_ = <$fh>; 
    } 
    print $_; 
    } 
} 

編輯2:

問題已經解決。查看答案。

+1

如果一行包含'<<< ... > >>','然後它chomp',並連接所有的下一行。沖洗,重複,直到在行末找到一個「;」。完成。 – TLP

+0

@TLP:我也嘗試連接。但仍然無效。 –

+0

您並未在該代碼中連接。 – TLP

回答

-1

好吧,我弄錯了我做錯了什麼。我試圖自己做到這一點。再次,我猜它效率不高,但它的工作原理。

編輯:決定不改變原來的。從@TLP

open my $fh, "<", $ARGV[0] or die "$!"; 
open my $out, ">", "output.out" or die "$!"; 
while (<$fh>) 
{ 
    if (/\<\<\<.*\>\>\>/) 
    { 
     while (1) 
     { 
      if (/\)\s*\;/) { s/\s//g; last; } 
      else { s/\s//g; 
       $_ .= <$fh>; } 
     } 
    } 
    print $out $_."\n"; 
} 

close $out; 
close $fh; 
+0

您可能有興趣使用'-i'開關,它可以爲您進行就地編輯。雖然我的個人偏好是不改變任何原文,但是做'perl foo.pl input.txt> output.txt'。另外,1)'\ s'包含'\ n',所以不需要兩次替換。 2)如果將它移到'if'塊之外,或者使用「continue」塊,則可以跳過其中一個'print'語句。使用'。='通常比使用兩個運算符更可取。你不需要逃避你的正則表達式中的所有角色。只有')'需要在那裏轉義,而且你真的不需要使用它,因爲'/; \ s * $ /' – TLP

+1

@TLP:感謝您的輸入。欣賞它。 –

3
my @long, $end; 
while (<>) {        # read a line 
    if (/<<<.*>>>/ .. ($end = /;/)) {  # if needs joining, 
    s/^\s+|\s+$//g;      # trim it 
    push @long, $_;      # add to list 
    print join(' ', @long) . "\n" if $end; # paste and print if at end 
    } else {         # if doesn't need joining, 
    print;         # just print without changes 
    } 
} 
0

有用輸入更改代碼這應該工作:

perl -npe 'if (/<<<.*?>>>/../;/) { chomp unless /;/ }' filename 

下面是它做什麼:

  1. 遍歷文件中的所有行(-n選項)
  2. 匹配(包括)<<<.*?>>>;之間的所有行,並從這些行中刪除換行符。這不適用於包含;的行。
  3. 打印所有行(-p選項)
0

假設我們正在談論壓縮包含<<<並儘可能;聲明:

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

while (<DATA>) { 
    if (m/<<</ .. m/\);$/) { 
     s/\s+/ /g; 
     s/;\s*$/;\n/g; 
    } 
    print; 
} 

__DATA__ 
... lines of code 
func1 <<< abc, xyz >>> (str1, 
         str2, 
         str3); 
... lines of code 
  • 我們使用範圍運算符檢測我們是否在<<<\);$之間
  • 如果是,我們用空格替換空格和換行符。
  • 同時,我們也需要再重新插入;

此輸出後的尾部換行:

... lines of code 
func1 <<< abc, xyz >>> (str1, str2, str3); 
... lines of code 
相關問題