テーブルからファイルを生成する必要があります。 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"
- 前には常にスペースがあるとします。
|
-E
EREを使用し、一部の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'