繁体   English   中英

使用sed查找并除以文件中的所有数字

[英]Find and divide all numbers in a file using sed

我试图在json文件中找到所有数字,并在Mac上使用sed将其替换为原始数字的一半。 例如,在这里我搜索2010并将其替换为1005:

file="data.json"
sed -i '' -E 's,([^0-9]|^)2010([^0-9]|$),\1 1005\2,g' "$file"

我想查找所有数字实例,并将其替换为自己的一半值。 它需要使用小数,例如:2009将变为1004.5,10.5将变为5.25。

我知道这可能会占用每个单独的数字字符,因此也许需要查找两侧带有非数字字符的数字。

编辑:我希望它具有灵活性,并且可以处理所有形式的文本文件,而不仅仅是JSON文件。 (.txt,.html,.rtf等...)

您可以将Perl与带有e修饰符的正则表达式一起使用:

perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file

要内联修改文件,请添加-i选项:

perl -i -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file
perl -pi.bak -e 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' file # To save a backup of the original file

参见在线演示

s="abc_2010_and+2009+or-10.5"
perl -pe 's{(?<!\d)(\d+(?:\.\d+)?)(?!\d)}{$1/2}ge' <<< "$s"
# => abc_1005_and+1004.5+or-5.25

(?<!\\d)(\\d+(?:\\.\\d+)?)(?!\\d)正则表达式匹配

  • (?<!\\d) -不允许在左边立即输入数字
  • (\\d+(?:\\.\\d+)?) -组1( $1 ):1+位数字,后跟可选序列. 和1个以上的数字
  • (?!\\d) -不允许在右边立即输入数字。

在RHS - $1/2 -是划分与第1组值的表达式2 这是通过在正则表达式的末尾添加e修饰符来实现的。

使用用于多字符RS和RT的GNU awk,它就是:

awk -v RS='[0-9]+([.][0-9]+)?' -v ORS= 'RT{$0=$0 RT/2} 1'

例如,借用@Wiktors示例:

$ s="abc_2010_and+2009+or-10.5"
$ awk -v RS='[0-9]+([.][0-9]+)?' -v ORS= 'RT{$0=$0 RT/2} 1' <<< "$s"
abc_1005_and+1004.5+or-5.25

如果要覆盖输入文件,则添加-i inplace

awk -i inplace -v RS...1' file

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM