嗨,我想替换所有的。 (点)在制表符分隔文件中的-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
. . . . . .
提前致谢。
答案 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
。