我有一个类似的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
但我认为我的正则表达式是错误的,它不起作用:(
答案 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