替换csv中的错误行

时间:2016-02-24 11:37:57

标签: regex linux replace sed grep

我有一个类似的csv文件:

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

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

我没有用sed找到正确的表达式,grep ...... :(

我想要这个结果:

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 

但我认为我的正则表达式是错误的,它不起作用:(

4 个答案:

答案 0 :(得分:1)

使用/b这似乎是可行的:

/b

它的作用:

  • 从第二行开始:检查第一个字段是否为数字并打印换行符
  • 任何行中的
  • :打印整行(awk),不带尾随换行符

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

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

答案 1 :(得分:0)

使用grep -P

grep -P "^\d" file.csv 

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

答案 2 :(得分:0)

由于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

答案 3 :(得分:0)

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