2014-01-30 35 views
-1

我有這樣perl腳本生成xml id增量?

<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**> 

**<ce:para>vvv</ce:para>** 

<ce:para id="p0015">vvv</ce:para> 

<ce:para id="p0020">vv</ce:para> 

**<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>** 

<ce:para id="p0070">vvddd</ce:para> 

現在我想產生這些標記ID =「PXXXX xml文件不有我在這裏大膽,但條件是ID是不相同的,ID是增量僅爲5。

+1

您不能將粗體添加到標記爲代碼的內容,但我們可以看到圖片。我沒有得到的是你想要做的。 – simbabque

+0

匹配所有「ce:para」標籤後,您不需要重新分配/重命名id值嗎? – tenub

+0

可能必須重做所有現有的ID。 – sln

回答

1

快速和髒的Perl溶液

use strict; 
use warnings; 

$/ = undef; 

my $str = <DATA>; 
my $i = 0; 

$str =~ s/(<ce:para) (?=\s|>) (.*?)>/"$1 id=\"p" . sprintf("%04d",$i+=5) . "\">"/xsge; 

print $str; 

__DATA__ 

<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**> 

    **<ce:para>vvv</ce:para>** 

    <ce:para id="p0015">vvv</ce:para> 

    <ce:para id="p0020">vv</ce:para> 

    **<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>** 

    <ce:para id="p0070">vvddd</ce:para> 

輸出>>

<ce:para id="p0005">xxx</ce:para>**<ce:para id="p0010">xxx</ce:para**> 

    **<ce:para id="p0015">vvv</ce:para>** 

    <ce:para id="p0020">vvv</ce:para> 

    <ce:para id="p0025">vv</ce:para> 

    **<ce:para id="p0030">vvvv</ce:para><ce:para id="p0035">xxxxxxx</ce:para>** 

    <ce:para id="p0040">vvddd</ce:para> 

編輯 - 如果只改變沒有ID的那些,,,,

use strict; 
use warnings; 

$/ = undef; 

my $str = <DATA>; 
my $i = 0; 

$str =~ 
s/ 
    (<ce:para)  # (1) 
    (?= \s | >) 
    \s* 
    (?: 
      id= 
      "p 
      (\d{1,})  # (2) 
      " 
     | .*? 
    ) 
    > 
/
    defined $2 and $i=$2-5; 
    "$1 id=\"p" . sprintf("%04d",$i+=5) . "\">" 
    /xsge; 


print $str; 

__DATA__ 

<ce:para id="p0010">xxx</ce:para>**<ce:para>xxx</ce:para**> 

**<ce:para>vvv</ce:para>** 

<ce:para id="p0015">vvv</ce:para> 

<ce:para id="p0020">vv</ce:para> 

**<ce:para>vvvv</ce:para><ce:para>xxxxxxx</ce:para>** 

<ce:para id="p0070">vvddd</ce:para> 

輸出>>

<ce:para id="p0010">xxx</ce:para>**<ce:para id="p0015">xxx</ce:para**> 

**<ce:para id="p0020">vvv</ce:para>** 

<ce:para id="p0015">vvv</ce:para> 

<ce:para id="p0020">vv</ce:para> 

**<ce:para id="p0025">vvvv</ce:para><ce:para id="p0030">xxxxxxx</ce:para>** 

<ce:para id="p0070">vvddd</ce:para> 
+0

我想要不改變退出id,只需要改變那些標籤don有id –

+0

@ Kathir K - 更新了答案,但爲此,存在重疊的可能性(如您所見)。對不起.. – sln

+0

有可能嗎?首先生成id並檢查exit是否再次增加而不替換...這樣我們檢查在替換之前是否退出。 –

0
use strict; 
use warnings; 
$/ = undef; 
my $str = '<ce:para><ce:para><ce:para><ce:para><ce:para id="p0010">'; 
my $i = 0; 
first: 
$i=$i+5; 
if($str =~ /<ce:para>/) { 
my $id=sprintf("%04d",$i); 
if($str =~ /<ce:para id="p$id">/){ 
goto first; 
} 
else{ 
$str =~ s/(<ce:para)>/"$1 id=\"p" . sprintf("%04d",$i) . "\">"/xse; 
}} 
if($str =~ /<ce:para>/){ 
goto first; 
} 
print $str; 

在這裏,我首先生成ID和數據查詢如果這個ID已經退出或沒有。如果退出ID跳過所有ce的替換和增量ID:para。

+0

@sln現在我可以爲所有不會包含屬性的標籤生成標識示例,我如何生成包含此標籤的屬性示例的標識的ID我想生成標識