列の単語の間にスペースがある場合は、二重引用符を追加してください。

列の単語の間にスペースがある場合は、二重引用符を追加してください。

テーブルからファイルを生成する必要があります。 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"
  • 前には常にスペースがあるとします。|
  • -EEREを使用し、一部のsedバージョンでは-r
  • ([^ |]+ +[^|]+)空白なし、|文字なし、少なくとも1つの空白、次の|文字なし
  • ( +\||$)上記のパターンの後には少なくとも1つのスペースがあり、次の行の|終わりが続きます。
  • "\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"

ただし、マルチワードフィールドも処理できます。

すべてのクールな子供たちは次のようになるので、これを1行に単純化してください。

perl -F'\s*\|\s*' -lane '/\s/&&s/(^|$)/\"/g for @F;print join " \| ",@F'

関連情報