在制表符分隔文件中用一个字符替换一个字符

时间:2018-05-08 04:45:29

标签: perl

嗨,我想替换所有的。 (点)在制表符分隔文件中的-1。

.   .   .   .   .   .
.   .   .   .   .   .
.   0.4012  0.359026    0.3616  0.246   0.4324
.   0.6795  0.60024 0.4713  0.6171  0.7386
.   0.6863  0.614018    0.5227  0.6131  0.7376
.   .   .   .   .   .
.   0.2044  0.210264    0.1936  0.2192  0.2376
.   0.2043  0.210064    0.1929  0.2183  0.2376
.   0.9852  0.984625    0.9425  1   1
.   .   0.10603 0.1127  0.127   0.0427
.   0.6934  0.709864    0.8222  0.6944  0.664
.   0.0219  0.0213658   0.0015  0.0397  0.0219
.   .   .   .   .   .

我怎么不想用数字替换存在的点数,即0.4012或0.359。

我试过这段代码

perl -p -i.backup -e 's/". /-1/g' .\abc.txt

但它没有工作

我得到的输出是

.   .   .   .   .   .
.   .   .   .   .   .
.   0.4012  0.359026    0.3616  0.246   0.4324
.   0.6795  0.60024 0.4713  0.6171  0.7386
.   0.6863  0.614018    0.5227  0.6131  0.7376
.   .   .   .   .   .
.   0.2044  0.210264    0.1936  0.2192  0.2376
.   0.2043  0.210064    0.1929  0.2183  0.2376
.   0.9852  0.984625    0.9425  1   1
.   .   0.10603 0.1127  0.127   0.0427
.   0.6934  0.709864    0.8222  0.6944  0.664
.   0.0219  0.0213658   0.0015  0.0397  0.0219
.   .   .   .   .   .

提前致谢。

2 个答案:

答案 0 :(得分:3)

你的perl 了。

请注意,替换格式的命令是s/pattern/replacement/flags,就像在sed中一样。模式是regular expression,其中单个点转换为"任何单个字符"。要匹配文字点,您需要使用反斜杠对其进行转义,或将其放在方括号中。

perl -p -i.backup -e 's/\.([^0-9])/-1\1/g' abc.txt

这匹配字母后面跟不是数字的字符,并用替换字符串替换它们,以及匹配的任何非数字字符(\1)。 Perl似乎认为该行末尾的null是一个非数字,这也允许替换该行末尾的点。

请注意,在perl中,您还可以将[^0-9]替换为[^\d]\D,将\1替换为$1。但前者仅适用于perl和(某些)GNU工具,而后者并不是命令行工具中最普遍的符号。就个人而言,我宁愿保持我的正则表达式和替换更便携,所以如果我要从perl切换到awk,我就不必重写这么多代码。

例如:

gawk '{$0=gensub(/\.([^0-9])/,"-1\1","g")}1' abc.txt > ,$$ && mv ,$$ abc.txt

sed -i.backup -Ee 's/\.([^0-9])/-1\1/g' abc.txt

如果您可以管理,便携性通常是一件好事。

答案 1 :(得分:0)

关注awk可能对您有帮助。

awk '{for(i=1;i<=NF;i++){sub(/^\.$/,"-1",$i)}} 1' Input_file

如果您的Input_file的分隔符为TAB,并且您希望以TAB格式输出,则将awk更改为awk -F"\t"并将Input_file更改为OFS="\t" Input_file