在char模式之间匹配N行,将N行移动到与char模式内联

时间:2019-03-29 04:12:43

标签: regex sed

我正在解析Wikipedia表。该表包含以下数据

CLASSPATH

我希望有一个正则表达式(可以在终端中执行,最好是sed或类似的东西),可以将任意N行数字移动到上述A-Z国家/地区名称

预期输出为:

Tonga
0
Trinidad and Tobago
10
14
24
Tunisia
10
6
16
Turkey
12
14.5
26.5

我还没有接近,这是我的最大努力。感谢您的光临

Tonga,0 Trinidad and Tobago,10,14,24 Tunisia,10,6,16 Turkey,12,26.5

产生

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

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

我尝试了\n,但是我又不知道如何在输出中保持匹配。它将所有字符替换为

tr

产生 tr 'A-z\n' ','

5 个答案:

答案 0 :(得分:4)

$ awk '{printf "%s%s", (/^[0-9]/ ? "," : s), $0; s=ORS} END{print ""}' file
Tonga,0
Trinidad and Tobago,10,14,24
Tunisia,10,6,16
Turkey,12,14.5,26.5

答案 1 :(得分:2)

请您尝试以下。

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

说明:

awk '
BEGIN{                      ##Starting BEGIN section here.
  OFS=","                   ##Setting output field seprator as comma here.
}
/^[a-zA-Z]+/ && val{        ##Checking condition if a line starts with alphabet and variable val is not null.
  print val                 ##Printing variable val here.
  val=""
}
{
  val=(val?val OFS:"")$0    ##Creating variable val and concatenating its value to its own for each line value.
}
END{                        ##Starting END block for this awk code.
  if(val){                  ##Checking if val is NOT NULL.
    print val               ##Then printing val here.
  }
}'  Input_file              ##Mentioning Input_file name here.

答案 2 :(得分:2)

还有一个PL/JSON解决方案:

sed

想法是将每个零件保存到存放空间中,然后关闭并用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并打印。

答案 3 :(得分:1)

另一种awk解决方案:

awk '/[a-zA-Z]/{if(FNR>1)print "";printf "%s",$0} $0+0==$0{printf ",%s",$0} END{print ""}' file

答案 4 :(得分:0)

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

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

$ perl -lpe 'BEGIN{undef $/} s/\n/,/g; s/([a-z ]+(,[\d.]+)*),/$1\n/ig' table