열의 단어 사이에 공백이 있는 경우 큰따옴표를 추가하세요.

열의 단어 사이에 공백이 있는 경우 큰따옴표를 추가하세요.

테이블에서 파일을 생성해야 합니다. sed를 사용하여 데이터를 전송하고 있습니다. 테이블 열에 공백이 있으면 텍스트 한정자를 사용하고 싶습니다.

입력 샘플

Unites State | California | UNIX | ABC DE

예상 출력

"Unites State" | California | UNIX | "ABC DE"

답변1

$ echo 'Unites State | California | UNIX | ABC DE' | sed -E 's/([^ |]+ +[^|]+)( +\||$)/"\1"\2/g'
"Unites State" | California | UNIX | "ABC DE"
  • 앞에는 항상 공간이 있다고 가정합니다.|
  • -EERE를 사용 하고 일부 sed버전에서는-r
  • ([^ |]+ +[^|]+)공백 없음, |문자 없음, 최소 하나의 공백, 그 다음 |문자 없음
  • ( +\||$)위의 패턴 뒤에는 최소한 하나의 공백이 있고 그 다음 |줄의 끝이 옵니다.
  • "\1"\2요청 시 견적

답변2

Perl은 꽤 좋습니다:

echo $'Unites State | California | UNIX | ABC DE' |perl -pe 's/[a-zA-Z]+[[:space:]]+[a-zA-Z]+/\"$&\"/g'
"Unites State" | California | UNIX | "ABC DE"

답변3

POSIX적으로:

sed 's/[^ |][^|]* [^|]*[^| ]/"&"/g'

ASCII 공간 이외의 공백 문자를 설명하려면 다음을 사용하십시오.

sed 's/[^[:blank:]|][^|]*[[:blank:]][^|]*[^|[:blank:]]/"&"/g'

답변4

Perl에서는 실제로 다음을 사용합니다 split.

#!/usr/bin/env perl
use strict;
use warnings;

#iterate data block below (use <> for reading STDIN)
while ( <DATA> ) {
   #split on whitespace|whitespace
   my @fields = split /\s*\|\s*/;
   #transform individual fields
   for ( @fields ) { 
      #check if it contains a space
      next unless m/\s/;
      #if it does, quote
      s/(^|$)/\"/g;
   }
   #print output; 
   print join " \| ", @fields,"\n";
} 

__DATA__
Unites State | California | UNIX | ABC DE

어떤 출력:

"Unites State" | California | UNIX | "ABC DE"

그러나 다중 단어 필드도 처리할 수 있습니다.

모든 멋진 아이들은 다음과 같기 때문에 이것을 한 줄로 단순화하십시오.

perl -F'\s*\|\s*' -lane '/\s/&&s/(^|$)/\"/g for @F;print join " \| ",@F'

관련 정보