![열의 단어 사이에 공백이 있는 경우 큰따옴표를 추가하세요.](https://linux55.com/image/108100/%EC%97%B4%EC%9D%98%20%EB%8B%A8%EC%96%B4%20%EC%82%AC%EC%9D%B4%EC%97%90%20%EA%B3%B5%EB%B0%B1%EC%9D%B4%20%EC%9E%88%EB%8A%94%20%EA%B2%BD%EC%9A%B0%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%EB%A5%BC%20%EC%B6%94%EA%B0%80%ED%95%98%EC%84%B8%EC%9A%94..png)
테이블에서 파일을 생성해야 합니다. 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"
- 앞에는 항상 공간이 있다고 가정합니다.
|
-E
ERE를 사용 하고 일부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'