공백을 쉼표로 바꾸되 전체 줄을 바꾸지는 마세요.

공백을 쉼표로 바꾸되 전체 줄을 바꾸지는 마세요.
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입력을 한 줄씩 읽고 각 줄을 처리합니다.
  • -F주어진 정규식의 각 줄을 @F 배열로 분할합니다.
  • =~"random" 다음 요소 뒤의 @F 배열의 네 번째 요소에만 교체를 바인드합니다.
  • 가입하다@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

관련 정보