ファイルのデータは次のとおりです。
入力例:
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'
1 つ以上の 10 進数で完全に構成されていないカンマ区切りフィールドは、引用符で囲まれます。つまり、(/^,/
)で/,$/
始まる,
、含める、または()で終わる行など、空のフィールドと,,
数字以外の数字(/[^,]*[^,0-9][^,]*/
)。
-2
、などの任意の10進浮動小数点数を認識するには、より複雑になり、次のようにする必要があります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