我有一个像这样的csv文件:
0;test1;description;toto 1;test2;description;tata 2;test3;desc ription;tutu 3;test4;description;tete
在shell中,我想要replace所有不以数字开头的行。 在这个例子中,我想用riptionreplace\ nription
我没有find正确的expression与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
但我认为我的正则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