파일의 데이터는 다음과 같습니다
입력 예:
123,xyz,456,abc
모든 문자열에 작은따옴표만 추가하면 됩니다. 먼저 숫자나 문자열을 확인해야 합니다. 첫 번째 항목이 숫자라고 가정하면 쉼표 뒤에 작은따옴표를 추가할 필요가 없으며 다음 문자열에는 작은따옴표를 추가해야 하며 출력은 아래와 같습니다.
123,'xyz',456,'abc'
답변1
echo ,123,xyz,456,,abc2 |
sed "s/[^,]*[^,0-9][^,]*/'&'/g;s/^,/'',/;s/,$/,''/;:1
s/,,/,'',/g;t1"
'',123,'xyz',456,'','abc2'
하나 이상의 십진수로 완전히 구성되지 않은 쉼표로 구분된 필드는 따옴표로 묶입니다. 즉, ( /^,/
)로 /,$/
시작 ,
하거나 포함하거나 ( )로 끝나는 줄과 같은 빈 필드 ,,
와 숫자가 아닌 숫자( /[^,]*[^,0-9][^,]*/
)).
-2
, 와 같은 임의의 십진 부동 소수점 숫자를 인식하려면 더 복잡해지며 다음을 사용해야 할 수도 1.23
있습니다 .1e-2
awk
awk -F, -v OFS=, -v q="'" '
{
for (i = 1; i <= NF; i++)
if ($i !~ /^[[:blank:]]*[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?[[:blank:]]*$/)
$i = q $i q
print
}'
변경 사항은 다음과 같습니다.
abc,,0x20, +2.23E-5 , x y ,-2
도착하다:
'abc','','0x20', +2.23E-5 ,' x y ',-2
당신이 얻고 싶다면
'abc','','0x20', +2.23E-5 , 'x y' ,-2
대신 다음을 수행합니다.
awk -F, -v OFS=, -v q="'" '
{
for (i = 1; i <= NF; i++)
if ($i !~ /^[[:blank:]]*[-+]?([0-9]+\.?[0-9]*|\.[0-9]+)([eE][-+]?[0-9]+)?[[:blank:]]*$/) {
sub(/[^[:blank:]]/, q "&", $i)
sub(/^$/, q, $i)
sub(/.*[^[:blank:]]/, "&" q, $i)
}
print
}'
답변2
sed
각 필드의 입력 데이터가 숫자 또는 문자 인 경우 :
sed -E "s/[[:alpha:]]+/'&'/g" <<<"123,xyz,456,abc"
또는 복합 모드에서.
sed -E "s/[0-9]*[[:alpha:]-]+[0-9]*/'&'/g" infile
입력하다:
123,xyz,456,abc
abc123,,a-b,5
산출:
123,'xyz',456,'abc'
'abc123',,'a-b',5