需要用双引号中的相同字符串替换文本文件中以0开头的所有字符串(除了having/and.) awk'{for(i=1;i
是的,0099也应该被引用。我错忘了 说明:需要用双引号中的相同字符串替换文本文件中以0开头的所有字符串(除了having/and.) awk'{for(i=1;i,awk,Awk,是的,0099也应该被引用。我错忘了 说明: /^0[[:alnum:][^.\/]/ ^断言字符串开头的位置 0逐字匹配字符0 匹配下面列表中的单个字符[[:alnum:] [:alnum::匹配字母数字字符[a-zA-Z0-9] 匹配下面列表中不存在的单个字符[^.\/] 匹配字符。按字面意思 \/与字符/字面匹配 为什么不是用引号括起来的0099呢?是的,0099也应该用引号括起来。我错了。@AnilKumar请编辑问题而不是注释。。输入是多行还是单行?我不明白为什么Dinidu的编辑被
/^0[[:alnum:][^.\/]/
断言字符串开头的位置^
逐字匹配字符00
- 匹配下面列表中的单个字符
[[:alnum:]
匹配字母数字字符[:alnum::
[a-zA-Z0-9]
- 匹配下面列表中不存在的单个字符
[^.\/]
匹配字符。按字面意思
与字符/字面匹配\/
0099
呢?是的,0099也应该用引号括起来。我错了。@AnilKumar请编辑问题而不是注释。。输入是多行还是单行?我不明白为什么Dinidu的编辑被批准了。您给出的两个命令都工作得很好,但如何合并两个命令的效果同时,第一个命令只放引号,第二个命令只保留空格。请参见编辑,perl命令保留空格并添加引号。您确实应该将所有这些详细信息放在问题中,而不是在注释中进行解释。您可以自己看到,格式无法在注释中传达……并清楚地解释您的r要求,如果您当前的示例不足以解释此问题,请更改此示例Perl命令在linux的bash shell上运行良好,但在HP UX的root/sbin/sh shell上运行不正常(无双引号)#echo$SHELL/sbin/sh/tmp#perl-lpe的#(^ |\h)\K0[^./\h]+(?=\h |$)#“$&”#g'test1 1234 012345 0.000 01/02/03 01234 05554567 0qwertyu 0099 0000 0000121800.000000 099000 0123456789您给出的命令工作正常,但输出没有保留输入的第1行和第8行中字符串之间的间距。输入中制表符的间距在输出中转换为单字符空间t、 添加-vofs=“\t”
成为awk-vq=”'-vofs=“\t”
awk '{for(i=1;i<=NF;i++){if($i~/^0[a-z,0-9][a-z,0-9]/){print $i}}}' test1 > test3
doWork()
{ rm /tmp/test1 && awk '{sub(/'$I'/, "\"'$I'\"", $0); print}' >test1;} < test1
for I in `cat /tmp/test3`
do doWork;
done;
$ awk -v dq='"' '{for(i=1;i<=NF;i++) if($i~/^0/ && $i!~/[./]/) $i=dq $i dq} 1' file
1234 "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000" "000012"
1800.000000
"099000"
"0123456789"
$ perl -lpe 's#(^|\h)\K0[^./\h]+(?=\h|$)#"$&"#g' file
1234 "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000" "000012"
1800.000000
"099000"
"0123456789"
$ awk -v q='"' '{for(i=1; i<=NF; i++)if($i ~/^0[[:alnum:]][^.\/]/)$i=q $i q}1' infile
1234 "012345"
0.000
01/02/03
"01234"
"05554567"
"0qwertyu"
"0099"
"0000" "000012"
1800.000000
"099000"
"0123456789"
$ cat infile
1234 012345
0.000
01/02/03
01234
05554567
0qwertyu
0099
0000 000012
1800.000000
099000
0123456789