2015-05-18 48 views
2

我有一個像Perl的替代符

1,2,3,{4,5,6,7,8},9,10,100 

我想更換{}領域之間的分隔符CSV文本。文本應該是這樣的:

1,2,3,{4|5|6|7|8},9,10,100 

我試圖perl -0777 -pe 's/\{.*?,\}/|/g'

但沒有任何反應。我該怎麼做呢?

回答

-1

你可以試試這個:

$st = "1,2,3,{4,5,6,7,8},9,10,100"; 
if ($st=~/\{(.*)\}/) { 
    $tr = $1; 
    $tr =~ s/,/|/g; 
    $st =~ s/\{*\}/{$tr}/; 
    print "$st \n" 
} 

輸出:

1,2,3,{4,5,6,7,8{4|5|6|7|8},9,10,100 
+0

呃,你看*在輸出你看? – Borodin

2

,你問這個就行了。它取代了後跟是括號{}字符序列的所有逗號,然後一個右括號

use strict; 
use warnings; 
use 5.010; 

my $s = '1,2,3,{4,5,6,7,8},9,10,100'; 

$s =~ s/,(?=[^{}]*\})/|/g; 

say $s; 

輸出

1,2,3,{4|5|6|7|8},9,10,100 
+0

如果有一個雜散的關閉花括號,這也會[觸發替換](https://regex101.com/r/uP8eA2/1)(例如'1,2,} 3,{4,5,6 ,7,8-},9,10,100')。也許,這對於OP來說並不重要,但我建議的解決方案只會替換配對的{}內部的逗號。 –

+1

如果有一個*雜散結束的花括號*,那麼OP沒有定義他們想要的行爲,並且推測 – Borodin

+0

感謝Borodin,我應該在前面提到過,我的文本文件嵌套{},如1 ,2,3-,A,b,C,d,{E,F,G,如圖6所示,{8,9,4},{6,4,A,S,},2,3,4},4, d,F,G。上面的作品{8 | 9 | 4},{6 | 4 | a | s |}但e,f,g,6部分不受影響。感謝你的幫助。 – user4911736

0

您可以使用下面的正則表達式與$1$2|替換字符串:

(\{\s*|(?<!^)\G)(\d+),(?=[,0-9]*\}) 

輸出:

1,2,3,{4|5|6|7|8},9,10,100 

Sample code

#!/usr/bin/perl 

$txt = "1,2,3,{4,5,6,7,8},9,10,100"; 
$txt =~ s/(\{\s*|(?<!^)\G)(\d+),(?=[,0-9]*\})/$1$2|/g; 
print $txt; 
0

下面是Perl的5.14和更高的命令行版本。

perl -pe 's/([{][\d,]+[}])/$1 =~ s~,~|~gr/ge' 

/e意味着它評估所述替換爲Perl表達式,而不是標準的正則表達式表達。這意味着它正在取第一個捕獲值($1)並執行替換並返回/r),以避免嘗試修改只讀值($1)時發生的錯誤。