命令:
perl -lpe '1 while (s/(^|\s)(0\d*)(\s|$)/$1"$2"$3/)' test5
输入:
1234 012345 0
0.000 01234 0
01/02/03 5467 0abc
01234 0123
0000 000054
0asdf 0we23-1
当前输出:
perl -lpe '1 while (s/(^|\s)(0\d*)(\s|$)/$1"$2"$3/)' test5
1234" 012345" " 0"
0.000" 01234" " 0"
01/02/03 5467" 0abc"
" 01234" " 0123"
" 0000" " 000054"
0asdf 0we23-1
例外输出:
1234" 012345" 0
0.000" 01234" 0
01/02/03 5467" 0abc"
" 01234" " 0123"
" 0000" " 000054"
" 0asdf" " 0we23-1"
输出中要遵循的条件:
除了/和之外,所有以0开头的字符串都有字母数字字符。应该加双引号。
如果字符串以0开头只有0个字符,则不应引用。
应保留字符串之间的间距。
答案 0 :(得分:2)
这似乎可以满足您的需求:
#!/usr/bin/env perl
use strict;
use warnings;
while ( <DATA> ) {
my @fields = split;
s/^(0[^\.\/]+)$/"$1"/ for @fields;
print join " ", @fields, "\n";
}
__DATA__
1234 012345 0
0.000 01234 0
01/02/03 5467 0abc
01234 0123
0000 000054
0asdf 0we23-1
注意 - 它并不像你要求的那样严格保留空白 - 它只是删除它并重新插入一个空格。这似乎符合您的规范,但您可以改为:
my @fields = split /(\s+)/;
因为这也会占据空间。
join "", @fields;
使用-a
进行自动分割可以将其简化为一个衬管:
perl -lane 's/^(0[^\.\/]+)$/"$1"/ for @F; print join " ", @F'
如果你想做第二位(严格保留空白),那么你需要放弃-a
并自己使用split
。