我有一个文件
file.txt
Name-6.1.4_Float Time;453802;464204;466345 464481 466131 464283 465065 462561
Name-6.1.4_Logic Good Time;125896;145349;137303 131601 144520 132487 133884
我要在第一个分号;
之后用;
替换数值之间的空格。数值之间的空格可以有多个空格。同样在Name_Float Time
上方也可以是任何东西。
预期输出:
Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;
这是我尝试过的:
sed 's/ /;/g;s/;;/;/g;s/$/;/g' file.txt
输出:
Name-6.1.4_Float;Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic;Good;Time;125896;145349;137303;131601;144520;132487;133884;
在上面的输出中,名称之间的空格也被;
代替。请建议我如何避免名称之间的空格被;
取代。谢谢。
答案 0 :(得分:2)
您可以使用以下awk
解决方案:
awk 'BEGIN{FS=OFS=";"} {s=$1; $1=""; gsub(/[[:blank:]]+/, OFS); $0= s $0 OFS} 1' file
Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;
或者,您可以在perl
的支持下使用\G
perl -pe 's/(^[^;]*|\G)[;\h]*(\b\d+|$)/$1;$2/g' file
Name-6.1.4_Float Time;453802;464204;466345;464481;466131;464283;465065;462561;
Name-6.1.4_Logic Good Time;125896;145349;137303;131601;144520;132487;133884;
\G
在上一场比赛的末尾或首场比赛的字符串开头断言位置
答案 1 :(得分:1)
您可以使用
sed -E ':a;s/(;[^ \t]+)[ \t]+/\1;/;ta' file
请参见online demo
详细信息
:a;
-标签s/(;[^ \t]+)[ \t]+/\1;
:
(;[^ \t]+)
-查找并<捕获>捕获到第1组...
;
-一个;
字符[^ \t]+
-除空格和制表符外的一个或多个字符[ \t]+
-匹配了1个或多个空格或制表符而未捕获\1;
-并用第1组内容替换,并在其后加上分号ta
-如果在前面的迭代中有匹配项,则循环到:a
。答案 2 :(得分:1)
使用Procedural Text Edit
,您可以这样做:
forEach line {
select (after ci ";") {
findReplaceAll ci " " ";"
removeDupeAdjacent ";"
}
}