sed中的第一个样式后如何删除空间

时间:2019-02-26 11:30:06

标签: awk sed

我有一个文件

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;

在上面的输出中,名称之间的空格也被;代替。请建议我如何避免名称之间的空格被;取代。谢谢。

3 个答案:

答案 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;

RegEx Demo & Details

\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 ";"
    }
}