我有一個像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'
但沒有任何反應。我該怎麼做呢?
我有一個像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'
但沒有任何反應。我該怎麼做呢?
你可以試試這個:
$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
,你問這個就行了。它取代了後跟是不括號{
}
字符序列的所有逗號,然後一個右括號
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
如果有一個雜散的關閉花括號,這也會[觸發替換](https://regex101.com/r/uP8eA2/1)(例如'1,2,} 3,{4,5,6 ,7,8-},9,10,100')。也許,這對於OP來說並不重要,但我建議的解決方案只會替換配對的{}內部的逗號。 –
如果有一個*雜散結束的花括號*,那麼OP沒有定義他們想要的行爲,並且推測 – Borodin
感謝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
您可以使用下面的正則表達式與$1$2|
替換字符串:
(\{\s*|(?<!^)\G)(\d+),(?=[,0-9]*\})
輸出:
1,2,3,{4|5|6|7|8},9,10,100
#!/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;
下面是Perl的5.14和更高的命令行版本。
perl -pe 's/([{][\d,]+[}])/$1 =~ s~,~|~gr/ge'
的/e
意味着它評估所述替換爲Perl表達式,而不是標準的正則表達式表達。這意味着它正在取第一個捕獲值($1
)並執行替換並返回(/r
),以避免嘗試修改只讀值($1
)時發生的錯誤。
呃,你看*在輸出你看? – Borodin