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