文件中的数据如下
输入示例:
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