Regex 在字符模式之间匹配N行,移动N行以与字符模式内联

Regex 在字符模式之间匹配N行,移动N行以与字符模式内联,regex,sed,Regex,Sed,我正在解析一个维基百科表。该表包含如下数据 Tonga 0 Trinidad and Tobago 10 14 24 Tunisia 10 6 16 Turkey 12 14.5 26.5 我希望有一个regex(终端中的可执行文件,最好是sed或类似文件),可以将任意数量的N行数字移动到上面的a-Z国家名称 预期产出为: Tonga,0 Trinidad and Tobago,10,14,24 Tunisia,10,6,16 Turkey,12,26.5 我还没有接近,这是我最大的努力。感

我正在解析一个维基百科表。该表包含如下数据

Tonga
0
Trinidad and Tobago
10
14
24
Tunisia
10
6
16
Turkey
12
14.5
26.5
我希望有一个regex(终端中的可执行文件,最好是sed或类似文件),可以将任意数量的N行数字移动到上面的a-Z国家名称

预期产出为:

Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,26.5
我还没有接近,这是我最大的努力。感谢您的惠顾

perl-pe的/^[0-9]*$/\n,/g'

产生


,
Trinidad and Tobago

,

,

,
Tunisia

,

,

,
Turkey

,
14.5
26.5
这是不正确的,因为我正在用
\n
替换,并且需要用其他内容替换
\n
。不幸的是,我不知道是否可以将
\n
与sed/perl匹配

我尝试了
tr
,但我仍然不知道如何保持输出上的匹配。它将所有字符替换为

tr'A-z\n','

产生

awk 'BEGIN{OFS=","}/^[a-zA-Z]+/ && val{print val;val=""} {val=val?val OFS $0:$0} END{if(val){print val}}'  Input_file
说明:


另一种
awk
解决方案:

awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file
sed -n -e '/[a-zA-Z]/{' -e 'x;/./s/\n/,/gp;x;h;}' -e '/^[0-9][0-9.]*$/H;${' -e 'x;/./s/\n/,/gp;}' file

sed
解决方案:

awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file
sed -n -e '/[a-zA-Z]/{' -e 'x;/./s/\n/,/gp;x;h;}' -e '/^[0-9][0-9.]*$/H;${' -e 'x;/./s/\n/,/gp;}' file

其想法是将每个部分保存到保留空间中,然后将
\n
切换为
s并打印。

通过perl 5,您的数据保存在“表”中

$  perl -lpe 'BEGIN{undef $/} s/\n(?!$)/,/g; s/(?<=\d),([a-z])/\n$1/ig' table

您尝试过什么吗?我尝试过匹配整数并将
\n
替换为
,但我的解决方案非常不正确。我还用perl尝试了类似的方法,但没有成功。。。yet@Goldfish请在问题中显示您尝试过的代码。检查。@Tiw我已经更新了两个我尝试过的例子,它们都不正确或接近IMO@Goldfish如果它不正确也没关系,如果它是正确的,你甚至可能不会在这里问。只是在这里展示你自己的努力是很重要和礼貌的,否则这似乎只是一个让别人做你的工作的要求,滥用这里答案的优点。这非常有效,你能为我自己和社区解释你的答案吗@胡言乱语13
$ perl -lpe 'BEGIN{undef $/} s/\n/,/g; s/([a-z ]+(,[\d.]+)*),/$1\n/ig' table