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;
空白は最初に表示されるまで保持されます。
- input が複数ある場合、
ta
a
以前の交換が成功した場合にラベルを付けるブランチ
答え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