スペースをカンマに変更しますが、行全体を変更しないでください。

スペースをカンマに変更しますが、行全体を変更しないでください。
some name;another thing; random; value value value value value

sedを使用した後に表示されるスペースを変更しようとしていますrandom;some nameたとえば、その中にスペースを保存することが重要です。

これにより、すべてのスペースがコンマで置き換えられます。*;*;*;sedなどの式を残りの行に使用し、スペースをコンマで置き換えるにはどうすればよいですか?

sed -e 's/ /,/g'

ありがとう

答え1

最後に区切られたフィールドにinを使用してくださいgsub()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入力を1行ずつ読み、各行を処理します。
  • -F与えられた正規表現の各行を @F 配列に分割します。
  • =~"random" 次の要素の後の @F 配列の 4 番目の要素にのみ置換をバインドします。
  • 参加する@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;部分の逆参照を使用してキャプチャされた文字列を保持し、スペースをコンマ文字に変更します。
    • input が複数ある場合、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

関連情報