用逗号替换空格,但不要在整行中替换空格

用逗号替换空格,但不要在整行中替换空格
some name;another thing; random; value value value value value

我正在尝试替换 using sed 之后出现的空格random;some name例如,保留其中的空间很重要。

这会将所有空格替换为逗号。我如何将像 and use sed 这样的表达式*;*;*;与该行的其余部分相匹配,并用逗号替换空格?

sed -e 's/ /,/g'

谢谢

答案1

在最后一个分隔字段上使用gsub()in :awk;

$ awk -F ';' 'BEGIN { OFS=FS } { gsub(" ", ",", $NF); print }' file
some name;another thing; random;,value,value,value,value,value

使用sed并假设我们想用;逗号替换最后一个之后的所有空格:

$ sed 'h;s/.*;//;y/ /,/;x;s/;[^;]*$//;G;s/\n/;/' file
some name;another thing; random;,value,value,value,value,value

带注释的sed脚本:

h               ; # Duplicate line into hold space
s/.*;//         ; # Delete up to the last ;
y/ /,/          ; # Change space to comma in remaining data
x               ; # Swap pattern and hold spaces
s/;[^;]*$//     ; # Delete from the last ;
G               ; # Append hold space delimited by newline
s/\n/;/         ; # Replace the embedded newline with ;
                ; # (implicit print)

“保持空间”是提供的单独的存储缓冲区sed。 “模式空间”是从输入读取数据并且可以对其应用修改的缓冲器。

答案2

Perl 来救援!

perl -F';' -ne '$F[3] =~ s/ /,/g; print join ";", @F'
  • -n逐行读取输入并处理每一行
  • -F将给定正则表达式上的每一行拆分到 @F 数组中
  • =~仅将替换绑定到 @F 数组的第四个元素,即“random”之后的元素之后
  • 加入将 @F 数组的元素连接回输出字符串

答案3

GNU sed

$ s='some name;another thing; random; value value value value value'
$ echo "$s" | sed -E ':a s/^(.*random;.*) /\1,/; ta'
some name;another thing; random;,value,value,value,value,value
  • :a标签a
  • s/^(.*random;.*) /\1,/这里(.*random;.*)将捕获random;输入行中的所有内容以及所需数量的字符,直到后面有空格为止,然后在替换部分中使用反向引用来保留捕获的字符串并将空格更改为逗号字符
    • 请注意,如果输入中有多个random;,则只会保留空格直到第一次出现
  • taa如果先前的替换成功则分支到标签

答案4

$ perl -MText::CSV_XS=csv -e'csv(in=>csv(in=>"file",sep=>";",allow_whitespace=>1),sep=>";",quote_space=>0);'
some name;another thing;random;value value value value value

相关内容