脚本用空格替换文件中的所有点,但不应替换数字中使用的点

时间:2013-11-15 11:56:11

标签: unix scripting replace awk vi

如何使用空格替换文件中的所有点,但不应替换1.232324.23232等数字中的点。

例如

输入:

abc.hello is with cdf.why with 1.9343 and 3.3232 points. What will 

输出:

abc_hello is with cdf_why with 1.9343 and 3.3232 point_ what will

4 个答案:

答案 0 :(得分:3)

$ cat file
abc.hello is with cdf.why with 1.9343 and 3.3232 points. What will
this is 1.234.
here it is ...1.234... a number
.that was a number.

$ sed -e 's/a/aA/g' -e 's/\([[:digit:]]\)\.\([[:digit:]]\)/\1aB\2/g' -e 's/\./_/g' -e 's/aB/./g' -e 's/aA/a/g' file
abc_hello is with cdf_why with 1.9343 and 3.3232 points_ What will
this is 1.234_
here it is ___1.234___ a number
_that was a number_

尝试使用该输入文件考虑的任何解决方案,因为它包含一些边缘情况(可能还有更多我没有包含在该文件中)。

解决方案基本上是将数字中的句点暂时转换为文件中任何其他位置都不存在的字符串,这样我们就可以将任何其他句点转换为下划线,然后撤消第一次临时转换。

首先,我们通过将所有a转换为字符串aA来创建文件中不存在的字符串,这意味着文件中不存在字符串aB。然后将数字中的所有.转换为aB s,然后将所有剩余的.转换为_,然后展开临时转换,以便aB返回{ {1}} s和. s返回aA s:

a

创建一个你知道的临时字符串在文件中不存在的方法是选择一个控制字符或试图找到一些字符串的常见替代方法你暂时不太可能存在于文件中需要一个文件中不存在的字符串。

答案 1 :(得分:1)

我想,那会做你想要的:

sed 's/\([^0-9]\)\.\([^0-9]\)/\1_\2/g' filename

这将用下划线(_)符号替换不在两位数之间的所有点(您可以在上面的命令中用空格字符交换下划线以在输出中获取空格。)

如果要将更改写回文件,请使用sed -i

编辑:

覆盖开头的点数。在行的结尾或直接在数字之前或之后,表达式变得有点丑陋:

sed -r 's/(^|[^0-9])\.([^0-9]|$)/\1_\2/g;s/(^|[^0-9])\.([0-9])/\1_\2/g;s/([0-9])\.([^0-9]|$)/\1_\2/g'

RESP:

sed 's/\(^\|[^0-9]\)\.\([^0-9]\|$\)/\1_\2/g;s/\(^\|[^0-9]\)\.\([0-9]\)/\1_\2/g;s/\([0-9]\)\.\([^0-9]\|$\)/\1_\2/g'

答案 2 :(得分:0)

awk -v RS='[[:space:]]+' '!/^[[:digit:]]+\.[[:digit:]]+$/{gsub("\\.", "_")}; {printf "%s", $0RT}' file.txt

答案 3 :(得分:0)

因为您使用vi标记了,我猜您可能也有vim?对于vim来说这将是一项非常容易的任务:

:%s/\D\zs\.\ze\D/_/g