如果列中的单词之间有空格,请添加双引号

如果列中的单词之间有空格,请添加双引号

我需要从表生成文件。我正在使用 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"\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

POSIXly:

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"

但也可以处理多词字段。

将其简化为一行,因为所有酷孩子都是:

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

相关内容