文字列(アルファベット)値に一重引用符を追加するには?

文字列(アルファベット)値に一重引用符を追加するには?

ファイルのデータは次のとおりです。

入力例:

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.231e-2awk

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

関連情報