在csv中replace错误的行

我有一个像这样的csv文件:

0;test1;description;toto 1;test2;description;tata 2;test3;desc ription;tutu 3;test4;description;tete 

在shell中,我想要replace所有不以数字开头的行。 在这个例子中,我想用riptionreplace\ nription

我没有find正确的expression与sedgrep … 🙁

我想要这个结果:

 0;test1;description;toto 1;test2;description;tata 2;test3;description;tutu 3;test4;description;tete 

非常感谢

编辑1:我有这样的尝试:

 LC_ALL=C tr '(\n)[0-9]' ' ' < hotels.csv > test.csv 

或这个 :

 sed ':a;N;$!ba;s/\r\n?![0-ç-9]/ /g' hotels.csv 

但我认为我的正则expression式是错误的,它不工作:(

awk这看起来是可行的:

 awk -F ';' '{if (NR>1 && match($1,/^[0-9]+$/)) printf("\n"); printf("%s",$0);} END{printf("\n")}' infile.csv 

它能做什么:

  • 从第二行开始:检查第一个字段是否是数字并打印换行符
  • 在任何行中:打印整行( $0 ),不用换行符

输出发送到STDOUT ,输入来自infile.csv

编辑:对不起,我错过了复制比赛(…)

使用grep -P

 grep -P "^\d" file.csv 

使用grep来匹配以数字开头的行。

由于sed的模式空间处理的特点,你将不得不使用这样的东西..

注意: ~必须是文本中不存在的字符

 $cat file 0;test1;description;toto 1;test2;description;tata 2;test3;desc ription;tutu 3;test4;description;tete $ sed 'N;s/\n/~/' file | sed -r 's/~([0-9])/\n\1/g;s/~//g' 0;test1;description;toto 1;test2;description;tata 2;test3;description;tutu 3;test4;description;tete 

PS:如果你的输入文件有Windows行尾,你将不得不使用\r\n而不是\n

 awk '{sub(/3;desc/,"3;description;tutu")}NR == 4 {next}1' file 0;test1;description;toto 1;test2;description;tata 2;test3;description;tutu 3;test4;description;tete