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